ARC – __unsafe_unretained的含义?
只是想确保我说得对:
- 我是否需要
__unsafe_unretain
我不拥有的对象? - 如果一个对象是
__unsafe_unretained
我是否需要在@property
使用assign
? 这是否意味着对象不被保留,只是指向我分配的对象? - 我何时想使用它,除了代表?
- 这是一个ARC的事情还是之前使用?
LLVM编译器3.0引入了四个新的所有权限定符: __strong
, __autoreleasing
__strong
, __autoreleasing
和__weak
。 根据规范 ,即使在ARC之外,前三个也是可用的 。
正如Joshua指出的那样,默认情况下所有的指针都暗示在ARC下是__strong
。 这意味着当一个对象被分配给该指针时,只要该指针指向该指针,该对象就会被保留。 对大多数情况来说,这是很好的做法,但是这为保留周期打开了可能性,正如我在这里的回答中所描述的那样。 例如,如果您有一个包含另一个对象作为实例variables的对象,但是该第二个对象与第一个对象具有强连接作为其委托,则两个对象将永远不会被释放。
正因为如此,存在__unsafe_unretained
和__weak
限定符。 他们最常用的用途是委托,你可以用weak
或unsafe_unretained
属性定义该委托的属性( assign
is unsafe_unretained
),然后用__weak
或__unsafe_unretained
标记相应的实例variables。 这意味着委托实例variables仍将指向第一个对象,但不会导致该对象被保留,从而打破了保留周期并允许释放这两个对象。
除代表之外,这对于打破代码中可能形成的任何其他保留周期很有用。 Leaks仪器现在包含一个Cycles视图,它以graphics方式显示了它在应用程序中发现的保留周期。
__unsafe_unretained
和__weak
阻止对象的保留,但方式稍有不同。 对于__weak
,指向一个对象的指针将在它指向的对象的释放时转换nil
,这是非常安全的行为。 顾名思义, __unsafe_unretained
将继续指向对象所在的内存,即使它被释放。 这可能会导致由于访问解除分配的对象而导致崩溃。
为什么你会用__unsafe_unretained
呢? 不幸的是, __weak
仅支持iOS 5.0和Lion作为部署目标。 如果你想要回到iOS 4.0和Snow Leopard,你必须使用__unsafe_unretained
限定符,或者使用像Mike Ash的MAZeroingWeakRef这样的东西 。
- 不,你也可以用
weak
的物体,你不拥有。 - 不,你也可以在属性上使用
unsafe_unretained
。 - 我的理解是,
unsafe_unretained
项目就像weak
,没有额外的安全性,当它们指向的项目被释放时(以及unsafe_unretained
的开销)清除它们。 - 这完全是一个ARC事物。
__unsafe_unretained
与ARC之前的对象的默认存储相同。 使用ARC时,默认值是__strong
这意味着您有一个引用,直到您的引用超出范围。
关于__unsafe_unretained的另一个观察:我的设备上的应用程序崩溃了,而不是在模拟器上,声明为__unsafe_unretained的iVar! 是的,这是ARC迁移代码中的一个错误,但是这是我第一次注意到设备和模拟器之间的差异。