strong / weak / retain / unsafe_unretained / assign

时间:2012-03-20 10:11:40

标签: objective-c cocoa

用于合成属性的属性: 保留/分配

  • 保留 - 保留,旧值释放并分配
  • assign - 仅分配

所有权属性: IOS5 =强/弱 IOS4 = retain / unsafe_unretained

  • 强(iOS4 =保留) - 我是主人,你不能解除这个 在确定目标之前=保留

  • 弱(iOS4 = unsafe_unretained) - 与assign相同,不保留 或发布

所以unsafe_unretained == assign?

@property (nonatomic, assign) NSArray * tmp;

等于?

@property (nonatomic, unsafe_unretained) NSArray * tmp;

,反之亦然?

如果是这样,在iOS4中哪一个更喜欢,或者为什么(unsafe_unretained)如果与assign完全相同?

并且iOS4中的委托应该是unsafe_unretained或assign?

2 个答案:

答案 0 :(得分:47)

  

如果是这样,在iOS4中哪一个更喜欢,或者为什么(unsafe_unretained)如果它与assign完全相同?

你应该使用unsafe_unretained。您希望向您的代码的读者显示您实际上想要使用的弱,但这是不可能的,因为在您要部署的iOS版本上没有弱。

有一天你会放弃对iOS4的支持。然后,您只需搜索unsafe_unretained并将所有内容替换为weak即可。这比搜索assign并弄清楚您是否真的需要assignweak

要容易得多

unsafe_unretained的使用创建了更易读且易懂的代码,开发人员的意图更容易被看到。 基本上我们使用YES代替1的原因相同。

答案 1 :(得分:3)

Cocoa和Cocoa Touch中有一些类尚不支持弱引用,这意味着你不能声明弱属性或弱局部变量来跟踪它们。这些类包括NSTextView,NSFont和NSColorSpace;有关完整列表,请参阅转换为ARC发行说明。

如果您需要对其中一个类使用弱引用,则必须使用不安全的引用。对于属性,这意味着使用unsafe_unretained属性:

 @property (unsafe_unretained) NSObject *unsafeProperty;

对于变量,您需要使用__unsafe_unretained:

NSObject * __unsafe_unretained unsafeReference;

不安全引用类似于弱引用,因为它不会使其相关对象保持活动状态,但如果目标对象被释放,则不会将其设置为nil。这意味着你将留下一个悬挂指针,指向最初由现在释放的对象占用的内存,因此术语“不安全”。向悬空指针发送消息将导致崩溃。

礼貌:Apple(https://developer.apple.com/library/ios/documentation/cocoa/conceptual/ProgrammingWithObjectiveC/EncapsulatingData/EncapsulatingData.html)。