05setter与getter方法

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)在多线程环境下,原子操作是必要的,否则可能引起错误的结果.

你可能感兴趣的:(05setter与getter方法)