变量限定符
ARC 为变量供了四种生命周期限定符。
__strong
这是默认的限定符,无需显示引入。只要有强引用指向,对象就会长时间驻留在内存 中。可以将 __strong 理解为 retain 调用的 ARC 版本。
__weak
这表明引用不会保持被引用对象的存活。当没有强引用指向对象时,弱引用会被置为 nil。可将 weak 看作是 assign 操作符的 ARC 版本,只是对象被回收时,weak 具有 安全性——指针将自动被设置为 nil。
__unsafe_unretained
与 weak 类似,只是当没有强引用指向对象时,unsafe_unretained 不会被置为 nil。 可将其看作 assign 操作符的 ARC 版本。
__autoreleasing
__autoreleasing用于由引用使用id *传递的消息参数。它预期了autorelease方法会 在传递参数的方法中被调用。
//创建对象后引用计数为 1,并且对象在 p1 引用期间不会被回收。
Person * __strong p1 = [[Person alloc] init];
//创建对象后引用计数为 0,对象会被立即释放,且 p2 将被设置为 nil。
Person * __weak p2 = [[Person alloc] init];
//创建对象后引用计数为 1,对象会被立即释放,但 p3 不会被设置为 nil。
Person * __unsafe_unretained p3 = [[Person alloc] init];
//创建对象后引用计数为 1,当方法返回时对象会被立即释放。
Person * __autoreleasing p4 = [[Person alloc] init];
属性限定符
属性声明有两个新的持有关系限定符:strong 和 weak。此外,assign 限定符的语义也被更新了。一言以蔽之,现在共有六个限定符。
strong
默认符,指定了 __strong 关系。
weak
指定了 __weak 关系。
assign
这不是新的限定符,但其含义发生了改变。在 ARC 之前,assign 是默认的持有关系限 定符。在启用 ARC 之后,assign 表示了 __unsafe_unretained 关系。
[copy]
暗指了 __strong 关系。此外,它还暗示了 setter 中的复制语义的常规行为。
retain
指定了 __strong 关系。
unsafe_unretained
指定了 __unsafe_unretained 关系。
因为 assign 和 unsafe_unretained 只进行值复制而没有任何 实质性的检查,所以它们只应该用于值类型(BOOL、NSInteger、NSUInteger,等等)。应避 免将它们用于引用类型,尤其是指针类型,如 NSString * 和 UIView *。
@property (nonatomic, strong) IBOutlet UILabel *titleView;
@property (nonatomic, weak) id<UIApplicationDelegate> appDelegate;
//错误地将 assign 用于指针。
@property (nonatomic, assign) UIView *danglingReference;
//对值类型正确地使用了 assign 限定符
@property (nonatomic, assign) BOOL selected;
@property (nonatomic, copy) NSString *name;
//retain 是 ARC 纪元之前的老古董,现代的代码已经鲜有使用。在这里添加它只是为了
完整性。
@property (nonatomic, retain) HPPhoto *photo;
@property (nonatomic, unsafe_unretained) UIView *danglingReference;