ARC当中变量的四种生命周期限定符
__strong
__weak
__unsafe_unretained
__autoreleaseing
- __strong 是默认的限定符,无需显示引入,只要有强引用指向,对象就会长时间驻留在内存中。可以将__strong理解为reatain调用的ARC版本。
- __weak 这表明引用不会保持被引用对象的存活。当没有强引用指向对象时,弱引用会被置为nil。可将__weak看作是assign操作符的ARC版本,只是对象被回收时,__weak具有安全性--指针将会被自动设置为nil。但是assign一般用来修饰基本数据类型,基本数据类型存储在由操作系统管理栈中,所以不用担心他什么时候置nil。
- __unsafe_unretained 与weak类似,只是当没有强引用指向对象时,__unsafe_unretained不会被置为nil。可以将它看作assin的ARC版本。
- __autoreleaseing 用于有引用使用 id *传递的消息参数。它预期了autorelease方法会在传递参数的方法中被调用。
Person * __strong p1 = [[Person alloc] init]; //创建对象之后引用计数器 为1,并且对象在p1被引用期不会被释放。
Person * __weak p2 = [[Person alloc] init]; //创建对象之后引用计数器 为0,对象会被立即释放,且p2将被设置为nil
Person * __unsafe_unretained p3 = [[Person alloc] init];//创建对象之后引用计数器 为0,对象会被立即释放,且p2不会被设置为nil
Person * __autoreleasing p4 = [[Person alloc] init]; //创建对象之后引用计数器 为1,当方法返回时对象会被立即释放
属性限定符
strong
默认,指定了__strong关系, 能保证 对象在其作用于内不会被销毁。
weak
指定了__weak关系,如果在一个{}作用于定义了一个__weak修饰的对象,由于引用计数器没有+1,创建好就是0,所以创建好了里么就会被销毁置nil。
assign
ARC当中表示 __unsafe_unreataied关系
copy
暗指了 __strong关系,它还暗指了 setter中的复制语义。
retain
指定了__strong关系。ARC中基本不用。
unsafe_unretained
指定了__unsafe_unretained关系。
注意:
assign 和 unsage_unretained 只进行值复制而没有任何实质性的检查,所以他们应该用于值类型(BOOL, NSInter, NSUInteger),应该避免将他们用于引用类型,尤其是指针类型,如NSString *, UIView *。
unsage_unretained修饰的对象创建之后会被立即释放,但是内存可能还没有被回收,这个引用可以使用,且不会导致错误。但是再次调用创建这个unsage_unretained修饰的对象的函数时就会出现SIGABRT崩溃。原因,第二次创建调用函数时,对象已经析构,而且内存也被重新分配和使用了,于是导致了非法访问。