Object-C的限定符的解惑总结

变量限定符

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;

   转载规则


《Object-C的限定符的解惑总结》 刘星星 采用 知识共享署名 4.0 国际许可协议 进行许可。
 上一篇
UIImage的简单封装 UIImage的简单封装
1、颜色转图片+ (UIImage *)imageWithColor:(UIColor *)color { CGRect rect = CGRectMake(0, 0, 1, 1); UIGraphicsBeginImage
2016-09-22
本篇 
Object-C的限定符的解惑总结 Object-C的限定符的解惑总结
变量限定符ARC 为变量供了四种生命周期限定符。__strong这是默认的限定符,无需显示引入。只要有强引用指向,对象就会长时间驻留在内存 中。可以将 __strong 理解为 retain 调用的 ARC 版本。 __weak这表明引用不
2016-08-07
  目录