提到属性修饰符就得捋捋MRC和ARC的支持问题。
xcode4.2及之前版本(iOS sdk4.3及之前版本),不支持ARC,即MRC。xcode4.3(ios5)之后支持ARC,并开始使用。
assign和retain
assign: 用于非指针变量,即无对象所有权,对象引用计数不加1。适用于基本数据类型 (例如NSInteger)和C数据类型(int, float, double, char, 等),另外还有id
如:
反正记住:前面不需要加 “*” 的就用assign吧
retain:用于指针变量,即持有对象指针,对象的引用计数加1。用于字符串( NSString,NSMutableString),数组(NSMutableArray,NSArray),字典对象,视图对象(UIView ),控制器对象(UIViewController)等
比如:
xcode 4.2不支持ARC,所以会频繁使用retain来修饰,用完释放掉,而xcode4.3支持ARC,可以使用retian,不需要手动释放内存,系统会自动为你完成,如果你在xcode4.3上面开发,retian和strong都是一样的,没区别
strong与weak是由ARC新引入的对象变量属性
strong 同retain
weak 同assign,区别是当对象完全释放后,weak会自动置为nil,assign不会。而且weak只能修饰OC对象。
unsafe_unretained 就是ios5版本以下的 assign ,也就是 unsafe_unretained , weak, assign 三个都是一个样的。 因为 ios5用的是 weak ,那在ios4.3就用不了,如果你将 weak 修改为 unsafe_unretained ,那就可以用了。说到底就是iOS 5之前的系统用该属性代替 weak 来使用。
copy 多用于修饰 不可变对象 NSString ,NSArray等。具体请参考 iOS基础 - copy 和 mutableCopy
readonly 此标记说明属性是只读的,默认的标记是读写,如果你指定了只读,在@implementation中只需要一个读取器。或者如果你使用@synthesize关键字,也是有读取器方法被解析。而且如果你试图使用点操作符为属性赋值,你将得到一个编译错误。
nonatomic 指出访问器不是原子操作,而默认地,访问器是原子操作。也就是说,在多线程环境下,解析的访问器提供一个对属性的安全访问,从获取器得到的返回值或者通过设置器设置的值可以一次完成,即便是别的线程也正在对其进行访问。如果你不指定nonatomic,在自己管理内存的环境中,解析的访问器保留并自动释放返回的值,如果指定了nonatomic,那么访问器只是简单地返回这个值。
关于CFObject和NSObject转换,由于ARC不能管理Core Foundation Object的生命周期,所以在Core Foundation和ARC之间,我们需要使用到__bridge,__bridge_retained和__bridge_transfer三个转换关键字。
__bridge只做类型转换,但是不修改对象(内存)管理权;
__bridge_retained(也可以使用CFBridgingRetain)将Objective-C的对象转换为Core Foundation的对象,同时将对象(内存)的管理权交给我们,后续需要使用CFRelease或者相关方法来释放对象;
__bridge_transfer(也可以使用CFBridgingRelease)将Core Foundation的对象转换为Objective-C的对象,同时将对象(内存)的管理权交给ARC。
__block MRC环境下使用,用来修饰block内部需要使用并改变的外部局部变量,避免循环引用,ARC时用__weak代替。