为什么在弱引用属性中,我应该使用unsafe_unretained限定符而不是assign?

12 浏览
0 Comments

为什么在弱引用属性中,我应该使用unsafe_unretained限定符而不是assign?

这两者有什么区别?\n@property(unsafe_unretained) MyClass *delegate;\n@property(assign) MyClass *delegate;\n它们都是非零弱引用,对吗?那么为什么我要写更长更难读的unsafe_unretained,而不是assign?\n注意:我知道有weak,它是一个零引用。但它只在iOS >= 5上可用。

0
0 Comments

为什么我应该在弱引用属性中使用`unsafe_unretained`修饰符而不是`assign`?这个问题的出现是因为在ARC下,当使用`assign`修饰符时,之前的代码将会出错。在ARC之前,`assign`属性会被映射为`unsafe_unretained`。然而,在ARC下,默认的属性修饰符是`__strong`,所以在这种情况下需要使用`unsafe_unretained`来正确地使用弱引用属性。

解决方法是在声明属性时使用`__unsafe_unretained`修饰符,或者使用ivar合成时直接使用`(unsafe_unretained) Bar *test`来声明属性。这样写只是不同的写法,但表达了不同的意图。

在iOS 4及以上的版本中都支持ivar合成。当使用ivar合成时,还需要注意其他一些事项。

0