@property的作用
当我们写下@property (nonatomic, strong) NSObject *food;编译器帮我们做了以下几件事:
- 创建实例变量_food;(自动生成私有属性)
- 自动生成food属性的setter、getter方法的声明。
- 自动生成food属性的setter、getter方法的实现。
生成的setter方法的实现中,无论是什么类型,都是直接赋值。
如果多个@property的类型一致,可以批量声明。@property float height, weight;
@property的四组参数
- 与多线程相关的两个参数:atomic、nonatomic
- 与生成setter方法实现相关的参数:assign、retain
- 与生成只读、读写相关的参数:readWrite、readOnly
- 与生成的setter、getter方法名字相关的参数:getter、setter
一、atomic和nonatomic
1、atomic和nonatomic用来决定编译器生成的getter和setter是否为原子操作。
2、atomic:默认值,表示生成的setter、getter方法会加上一把线程锁。特点:安全,效率低下。
3、nonatomic:表示生成的setter、getter方法不会加上一把线程锁。特点:相对atomic来说不安全,但是效率比atomic高。
注意:无论是ARC和是MRC的模式下都可以使用这两个参数。建议使用nonatomic。
二、assign和retain
1、assign:默认值。当属性的类型是非OC对象时,使用assign,setter方法就是对属性直接赋值。
2、retain:当属性是OC对象的数据时,生成的setter方法的实现就是标准的MRC内存管理代码。(先判断新旧对象是否是同一个对象,如果不是,就release旧值,retain新值)。
注意:retain参数,生成的setter方法是标准的MRC内存管理代码。不会自动的在dealloc方法中生成release方法。所以还要手动的在dealloc方法中调用对象的release方法。
三、readWrite和readOnly
1、readwrite:默认值。代表同时生成setter和getter方法。
2、readonly:只会生成getter方法而不会生成setter方法。
四、getter和setter
1、如果使用了setter、getter方法修改了生成的方法的名字,在使用点语法的时候,编译器会转换为修改后的名字的代码。
2、当属性的类型是一个BOOL类型的时候,可以修改这个getter方法的名字为is开头,提高代码的阅读性。
注意: 无论什么情况下都不要改setter方法的名字,因为默认情况下生成的名字已经是做标准的了。
参数的使用注意
1、同一组参数只能使用一个,setter和getter可以同时使用
2、参数的顺序可以随意