/*
Objective-C - @property的参数总结
1> 回顾@property的功能:
1,自动生成私有的带下划线的属性;
2,自动的生成这个属性的setter/getter方法的声明;
3,自动的生成这个属性的setter/getter方法的实现;
setter的实现,直接赋值;getter的实现,直接返回.
注意: 生成的是不含内存管理代码的setter方法.
2> @property的参数:@property可以带参数,带不同的参数可以实现不同的功能.
语法:@property(参数1,参数2,...)数据类型 数据名称;
"1,与多线程相关的参数
atomic :默认值.生成的setter/getter方法是很安全的方法,安全但是性能低下.
nonatomic:生成的setter/getter方法不安全,但是效率高.
(注意:无论是在MRC还是在ARC模式下,推荐使用nonatomic,不写的话默认是atomic).
"2,与生成setter方法实现相关的参数
assign:默认值.如果使用assign,生成的setter方法的实现中,就是直接将参数的值赋值给属性.
retain:生成的setter方法中,是标准的MRC内存管理代码.如下:(以YYCar *_car为例)
- (void)setCar:(YYCar *)car
{
if(_car != car)
{
[_car release];
_car = [car retain];
}
}
(当属性的类型是oc对象的时候,就使用retain.当属性的类型是非oc对象的时候,就使用assign).
(但是并不会在dealloc中也生成release代码,所以dealloc中的release需要自己去写).
"注意:retain只能使用在MRC模式下,当属性的类型是oc对象的时候,绝大多数场景下使用retain.
assign可以使用在ARC和MRC模式下.
在ARC模式下,当属性的类型是非oc对象的时候,一律使用assign;
在MRC模式下,当属性的类型是非oc对象的时候,一律使用assign,二者相同.
在MRC模式下,出现循环引用的侍候 ,一边使用assign,一边时用retain.
"3,strong:如果使用strong来修饰类的属性,代表@property生成的私有属性是一个强类型的.
weak:如果使用weak来修饰类的属性,代表@property生成的私有属性是一个弱类型的.
注意:ARC机制下,setter方法的实现,不需要做别的什么事情,直接复制就可以,所以MRC下的retain在ARC无法使用.
总结:在ARC机制下,如果属性的类型是oc对象类型的,绝大多数情况下使用参数strong,如果属性的类型是非oc对象类型的,绝大多数情况下使用assign,也就是相当于把MRC下的retain换成了strong.
"注意:strong只能使用在ARC模式下,当属性的类型是oc对象类型的,绝大多数情况下使用参数strong;
weak:只能使用在ARC模式下,当出现循环引用的时候,一边使用strong,一边使用weak.
"4,与生成只读,读写封装相关的参数
readwrite:默认值.同时生成setter/getter方法.
readonly:值生成getter方法,不生成setter.
"5,与指定生成的setter/getter方法的名称相关的参数
setter:可以指定生成的setter方法的名称;
语法:setter = abc,即生成的setter方法的名称是abc,即: - (void)abc:(YYCar *)car;
getter:可以指定生成的getter方法的名称;
语法:getter = abc,即生成的getter方法的名称是abc,即: - (YYCar *)abc;
只有当属性的类型是BOOL类型的时候,我们可以修改getter方法的名称,以提高代码的阅读性:
例:@property(getter = isGoodMan) BOOL goodMan;
例:YYPerson *xiaoming = [YYPerson new];
xiaoming.goodMan = YES;
NSLog(@"%d", xiaoming.isGoodMan);
注意:参数的顺序没有要求,同一组参数不可以同时使用.
*/