举个例子:
NSString *houseOfMM = [[NSString alloc] initWithString:'装梵几的三室两厅'];
上面一段代码会执行以下两个动作:
什么时候用assign,当然是破房子,简装的房子拉
基础类型(简单类型,原子类型):NSInteger,CGPoint,CGFloat,C数据类型(int,float,double,char等)
什么时候用copy
含有可深拷贝的mutable子类的类,如NSArray,NSSet,NSDictionary,NSData的,NSCharacterSet,NSIndexSet,NSString
(可深度拷贝的房子)
但是NSMutableArray这样的不可以,Mutable的不能用copy,不然初始化会有问题。切记
什么时候用retain
其他NSObject和其子类对象好嘛 (大多数)
ARC中的strong相当于非ARC中的retain,ARC来了以后多搞一把钥匙就strong了啦。
From The Objective-C 2.0 Programming Language here is how assign retain and copy will be effectively implemented by @synthesize and how they should be functionally implemented by you if not synthesized.
assign, retain, copy 属性是用来指定 setter 方法的工作方式:
assign(default) 简单的赋值, assign不会对新的值做retain. 如果使用对象类型的参数, 同时没有启用 garbage collector, 不要使用assign
retain: release旧的值, 同时retain新值. 这个属性用在参数为Objective‐C对象类型时. 如果启用了garbage collector, 它和assign作用一样. [启用了garbage collector. release和retain什么也不做.]
copy: 对新值做拷贝, 把拷贝赋值给变量. 变量为string时,常用该属性.
最后,我们还可以使用nonatomic属性. 如果我们的程序是多线程的. 那么让setter方法成为 atomic 是非常重要的.