首页 > 代码库 > iOS开发核心语言Objective C —— 面向对象思维、setter和getter方法及点语法

iOS开发核心语言Objective C —— 面向对象思维、setter和getter方法及点语法

本分享是面向有意向从事iOS开发的伙伴们。或者已经从事了iOS的开发人员。假设您对iOS开发有极高的兴趣,能够与我一起探讨iOS开发。一起学习,共同进步。假设您是零基础,建议您先翻阅我之前分享的iOS开发分分钟搞定C语言系列。然后在開始Objective C语言的学习,假设您遇到问题也能够与我探讨,另外将无偿分享自己整理的大概400G iOS学习视频及学习资料。都是干货哦。能够新浪微博私信?关注极客James。期待与您的共同学习和探讨。!

由于时间有限,每天在工作之余整理的学习分享。难免有不足之处,也希望各路大神指正!

made by :极客James
技术分享

一、OC中面向对象特性 封装
1.封装
封装性就是隐藏实现细节,,仅对外公开接口。


2.为什么要进行封装?
类是数据与功能的封装,数据就是成员变量,功能就类方法或对象方法
对数据的封装。也就是对成员变量的封装
不封装的缺点:当一个类把自己的成员变量暴露给外部的时候,那么该类就失去对该成员变量的管理权。别人能够随意的改动你成员变量。
封装就是将数据隐藏起来,仅仅能用此类的方法才干够读取或者设置数据,不可被外部随意改动是面向对象设计本质。减少了数据被误用的可能性! 提高代码的灵活性。

封装的原则:
将不须要对外提供的内容都隐藏起来,把属性都隐藏,提供公共的方法对其訪问。

二、OC中面向对象特性 继承
1.继承
同一基类中的共同特性,子类也有其特性,简言之子类继承父类的。就叫做继承。
2.继承关系
B类继承A类。那么B类将拥有A类的全部属性和方法,此时我们说A类是B类的父类,B类是A类的子类。

C类继承B类,那么C类将拥有B类中的全部属性和方法。包含B类从A类中继承过来的属性和方法。此时我们说B类是C类的父类,C类是B类的子类。

3.OC中实现继承的格式

@interface 子类名称 : 父类名称

@end

三、OC中面向对象特性 多态
1.多态
同一事物的多种表现形式。

在程序中为:父类指针指向子类对象。

2.多态的条件
(1)有继承关系
(2)子类重写父类方法
(3)父类指针指向子类对象
表现:当父类指针指向不同的对象的时候,通过父类指针调用被重写的方法的时候。会执行该指针所指向的那个对象的方法。

3.多态的长处
多态的主要长处就是简化了编程接口。它同意在类和类之间重用一些习惯性的命名,而不用为每个新加的函数命名一个新名字。

这样,编程接口就是一些抽象的行为的集合,从而和实现接口的类的区分开来。

多态也使得代码能够分散在不同的对象中而不用试图在一个函数中考虑到全部可能的对象。

这样使得您的代码扩展性和复用性更好一些。当一个新的情景出现时,您无须对现有的代码进行 改动,而仅仅须要添加一个新的类和新的同名方法。

4.多态的注意点
1)假设存在多态,父类是能够訪问子类特有的方法。
2)假设父类指针指向子类对象, 假设须要调用子类特有的方法, 必须先强制类型转换为子类才干调用。

四、setter方法
1.作用
用来设置成员变量。能够在方法里面过滤掉一些不合理的值

2.命名规范
(1)必须是对象方法。


(2)返回值类型为void。
(3)方法名必须以set开头,而且后面跟上成员变量名去掉”_” 首字母必须大写。


(4)必须提供一个參数,參数类型必须与所相应的成员变量的类型一致
形參名称和成员变量去掉下划线同样。

实例:

- (void)setAge:(int)age;

3、setter方法的长处
不让数据暴露在外,保证了数据的安全性
对设置的数据进行过滤

五、getter方法
1.作用
为调用者返回对象内部的成员变量的值。

2.命名规范
(1)必须是对象方法
(2)必须有返回值,返回值的类型和成员变量的类型一致
(3)方法名必须是成员变量去掉下划线
(4)一定是没有參数的

实例:
假设成员变量为int _age 那么与之相应geter方法为

- (int) age;

getter的实现方法:

  - (int)age{
  return _age;
}

3.getter方法的长处
(1)能够让我们在使用getter方法获取数据之前,对数据进行加工;
(2)比方双十一活动。我们希望对全线商品的价格在原来的价格基础上打五折,那么我们仅仅要去改成品类的价格的getter方法就能够了。让他返回的值为价格 * 0.5。

六、setter和getter方法的注意
(1)在实际的开发中,不一定set和get方法都会提供,假设内部的成员变量,比方学生的学号或计算出来的数据。

这样的数据仅仅同意外界读取。可是不同意改动的情况,则通常仅仅提供get方法而不提供set方法 。

(2)成员变量名的命名以下划线开头,get方法名不须要带下划线

(3)成员变量名使用下划线开头有两个长处
(4)与get方法的方法名区分开来
(5)能够和一些其它的局部变量区分开来,下划线开头的变量,通常都是类的成员变量。当我看到以下划线开头变量。那么他一定是成员变量
(6)一个属性能够仅仅有getter方法, 没有setter方法, 这样的属性我们称之为仅仅读属性
(7)一个属性也能够仅仅有setter方法, 没有getter方法, 这样的属性我们称之为仅仅写属性
(8)假设既有setter方法又有getter方法, 那么这样的属性我们称之为可读可写的属性,而且, 一个属性也能够没有getter和setter, 这样的属性我们称之为私有属性。

七、点语法
1.点语法本质
点语法的本质是是方法调用,是编译器特性。当有点语法时。编译器就会生成相应的方法,在iOS开发中很重要也很经常使用。

2.点语法特质
当点语法使用在 “=“赋值符号左側的时候。点语法会被展开为setter方法的调用,其它情况(等号右側、直接使用)为点语法展开为getter方法的调用。

3.点语法注意
(1)点语法的本质是方法的调用,而不是訪问成员变量,当使用点语法时,编译器会自己主动展开成相 应的方法调用。

(2)切记点语法的本质是转换成相应的对setter和getter方法调用,假设没有set和get方法,则不能使用点语法。

(3)不要在getter 与 setter方法中使用本属性的点语法。

(4)点语法一般用于给成员变量赋值, 假设不是给成员变量赋值普通情况下不建议使用, 可是也能够使用。

- (void) setAge:(int)age {
    // 以下的代码会引发死循环
    self.age = age;
        //编译器展开后 [self setAge:age]
}
- (int) age {
    // 以下的代码会引发死循环
    return self.age;
          // 编译器展开后 [self   age]
}

八、self关键字、super关键字
1.self关键字
(1)首先要理解什么是self。什么是成员变量。什么是对象方法,什么是类方法这几者的概念。
(2)成员变量:成员变量是一个实例对象的详细状态特征。而且这些状态特征是能够改变的,如张三的年龄,身高,体重等
(3)对象方法:一个实例对象的行为。比方张三具有吃的行为,张三做出这样行为的时候,有可能会影响,自身的某些状态特征。比方张三吃可能会添加张三体重和身高。
(4)类方法:类方法是某个类的行为,能够直接通过类名调用。假设在类方法中须要使用某些数据,必须通过參数传入;它不能訪问成员变量。

2.类方法中的self
(1)在整个程序执行过程中,一个类有且仅有一个类对象。
(2)通过类名调用方法就是给这个类对象发送消息。
(3)类方法的self就是这个类对象
(4)在类方法中能够通过self来调用其它的类方法
(5)不能在类方法中去调用对象方法或成员变量,由于对象方法与成员变量都是属于详细的实例对象的。


(6)类方法中能够直接调用类方法
(7)类方法中不能够直接调用对象方法
(8)类方法中不能訪问成员变量

3.对象方法中的self
(1)在整个程序执行过程中。对象能够有0个或多个
(2)通过对象调用方法就是给这个对象发送消息
(3)对象方法中self就是调用这种方法的当前对象。


(4)在对象方法中。能够通过self来调用本对象上的其它方法
(5)在对象方法中。能够通过self来訪问成员变量

4.self总结
(1)谁调用self所在的方法。那么self就是谁
(2)self在类方法中。就是这个类的类对象。全局仅仅有一个,可通过self调用本类中的其它类方法,可是不能通过self来调用对象方法或訪问成员变量
(3)self在对象方法中,就是调用这种方法的那个对象, 能够通过self调用本类中其它的对象方法。訪问成员变量,但不能通过self调用本类的类方法。
(4)通过self调用方法的格式:[self 方法名];
(5)通过self訪问成员变量格式:self->成员变量名
(6)我们仅仅用关注self在哪一个方法中 , 假设在类方法那么就代表当前类, 假设在对象方法那么就代表”当前调用该方法的对象”.

5.self使用注意
(1)同一时候有对象方法和类方法存在的时候,self不会调错
(2)self仅仅能在方法中使用;不要使用self来调用函数,也不能够在函数内部使用self;
(3)使用self调用本方法,导致死循环调用。

九、实例变量修饰符
1.实例变量的作用域
1)@public (公开的)在有对象的前提下不论什么地方都能够直接訪问。
2)@protected (受保护的)仅仅能在当前类和子类的对象方法中訪问
3)@private (私有的)仅仅能在当前类的对象方法中才干直接訪问
4)@package (框架级别的)作用域介于私有和公开之间,仅仅要处于同一个框架中相当于@public,在框架外部相当于@private

2.变量修饰符在子类中的訪问
1)@private私有成员是能被继承,也不能被外部方法訪问。


2)@public 公有成员能被继承,也能被外部方法訪问。
3)@protected 保护成员能够被继承,不能够被外部方法訪问。

3.实例变量作用域使用注意事项
(1)在@interface @end之间声明的成员变量假设不做特别的说明,那么其默认是protected 的。
(2)一个类继承了还有一个类,那么就拥有了父类的全部成员变量和方法,注意全部的成员变量它都拥有,仅仅是有的它不能直接訪问。比如@private的

技术分享

<script type="text/javascript"> $(function () { $(‘pre.prettyprint code‘).each(function () { var lines = $(this).text().split(‘\n‘).length; var $numbering = $(‘
    ‘).addClass(‘pre-numbering‘).hide(); $(this).addClass(‘has-numbering‘).parent().append($numbering); for (i = 1; i <= lines; i++) { $numbering.append($(‘
  • ‘).text(i)); }; $numbering.fadeIn(1700); }); }); </script>

iOS开发核心语言Objective C —— 面向对象思维、setter和getter方法及点语法