黑马程序员技术交流社区

标题: OC三大特性之封装(set/get的改进) [打印本页]

作者: 小石头16544    时间: 2016-1-19 23:31
标题: OC三大特性之封装(set/get的改进)
下面的说法,以下面这个类为例:
@interface Person :NSObject
{
int  age
;}
@end
Person * person= [ Person new ]
1.调用的简化——点语法
使用set函数:[person setAge:10]
使用点语法:Person.age=10;
使用get函数:int num=[person age]
使用点语法:int  num=person.age;
注意: 点语法的本质是方法调用,而不是直接访问成员变量,所以,如果没有set方法和get方法,是不能使用点语法的,使用点语法和使用set、get函数是完全等价的
点语法表示set、get函数的时候,表示方式是完全相同的,
至于这个点语法代表的是get方法还是 set 方法,那就取决于你是取值还是设值,取值 就是get方法, 设值就是set方法  (也可以理解为点语法是在“=”的左侧还是右侧,左 侧:如 stu.age=.... 这就是调用set方法,右侧 ... = stu.age 这就是调用get方法)点语法陷阱:点语法表示的是set/get,所以不能在相应的方法中使用,会死循环
2.声明的简化—— @property
    @property是编译器的指令 。什么是编译器的指令?  
编译器指令就是用来告诉编译器要做什么
@property 告诉编译器声明属性的访问器(getter/setter)方法
@property的用法:
@property 属性的类型 方法名(一般是没有下划线的属性名) 在.h文件中,自动生成成员变量的set/get的方法声明
注意:如果方法名带了下划线,那么它声明的set和get方法名也就带下划线了(set_age)3
.实现的简化—— @synthesize
@synthesize在.m文件中定义set/get方法的实现1)
@synthesize 是配合@property使用的
@property int age;(生成声明)
@synthesize age;(生成实现)
声明中必须有@property,实现中才可以使用@synthesize
正确用法:
先定义实例变量:int  _age;
@property age;声明方法
@synthesize age;实现方法
(age要和property中的保持一致2)
在使用@synthesize 给指定的实例变量赋值的时候
@synthesize age实际上是在.m中生成了一个私有属性,是age,这时候,我们设置和访问(设值,取值)的都是age,而不是我们实例变量中定义的_age
所以我们写的时候,写成:@synthesize age=_age;
4. @property的增强使用  
Xcode4.4之后对@property进行了增强
@property的作用:
@property age;
1)如果我们没有手动声明age这个实例变量,那么property会在.m中自动生成一个_开头的实例变量,是私有属性(如果想要子类继承父类的成员变量,还是必须在.h中手动写实例变量)
2)会生成get/set方法的声明
3)会生成get/set方法的实现
5. @property增强下重新实现get和set方法使用
@property时,如果系统默认的get和set方法不能满足我们的需求,这个时候,如果想要重写,那么不能同时重写get和set方法(这种情况的前提是,我们操作的这个属性,我们没有手动在.h中声明,如果声明了,则没有这个限制)





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2