setter/getter方法 与 @proterty
(一)点语法的本质
点语法的本质是方法的调用,当使用点语法时,编译器会自动将其转化为setter/getter方法,如果没有setter和getter方法,就不能使用点语法.
(二)点语法使用时的注意事项
以下这种方式是一个死循环:
(1)在setter方法中,self.weight = weight; 相当于[self setWeight:weight];
(2)在getter方法中,return self.weight ; 相当于[self weight];
(三)@property 与 @synthesize关键字的作用
(1)@property 关键字
@property 关键字 可以自动生成某个实例变量(成员变量)的setter和getter方法的声明.
例:
@property float weight;
编译时遇到这行代码,会自动扩展为以下两句:
-(void)setWeight:(float)weight;
-(float)weight;
(2)@synthesize 关键字
@synthesize 关键字 可以自动生成某个实例变量(成员变量)的setter和getter方法的实现.
例:
@synthesize weight = _weight;
//左边的weight 代表实现@property float weight
//右边的_weight 代表_weight这个实例变量
编译时遇到这行代码,会自动扩展为以下代码:
- (void)setWeight:(float)weight
{
_weight = weight;
}
- (float)weight
{
return _weight;
}
(四)关键字使用时的注意事项
(1)从Xcode4.4之后,@property关键字独揽了三个功能,这三个功能分别是:
1)生成_weight实例变量的get和set方法的声明;2)生成_weight实例变量set和get方法的实现;3)生成一个_weight的实例变量。
相当于独揽了@property和@synthesize的功能.
2)重写setter/getter方法(手写实现):
1)如果手动实现了set方法,那么编译器就只生成get方法和实例变量;
2)如果手动实现了get方法,那么编译器就只生成set方法和实例变量;
3)如果set和get方法都是手动实现的,那么编译器将不会生成实例变量。
(五)nonatomic 与 atomic(了解)
(1)nonatomic 与 atomic用来决定编译器生成的setter和getter方法是否为原子操作.
(2)atomic:是一种线程保护技术,提供线程安全.是为了防止在写未完成的时候,就被另外一个线程读取,从而造成数据的错误.但是这种机制耗费系统资源.
nonatomic:如果对象不用考虑多线程的情况,那么就可以使用nonatomic,可以提高执行效率.
(3)在多线程环境下,原子操作是必要的,否则可能引起错误的结果.