用于合成属性的属性: 保留/分配
所有权属性: 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?
答案 0 :(得分:47)
如果是这样,在iOS4中哪一个更喜欢,或者为什么(unsafe_unretained)如果它与assign完全相同?
你应该使用unsafe_unretained
。您希望向您的代码的读者显示您实际上想要使用的弱,但这是不可能的,因为在您要部署的iOS版本上没有弱。
有一天你会放弃对iOS4的支持。然后,您只需搜索unsafe_unretained
并将所有内容替换为weak
即可。这比搜索assign
并弄清楚您是否真的需要assign
或weak
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。这意味着你将留下一个悬挂指针,指向最初由现在释放的对象占用的内存,因此术语“不安全”。向悬空指针发送消息将导致崩溃。