ARC – __unsafe_unretained的含义?

只是想确保我说得对:

  1. 我是否需要__unsafe_unretain我不拥有的对象?
  2. 如果一个对象是__unsafe_unretained我是否需要在@property使用assign ? 这是否意味着对象不被保留,只是指向我分配的对象?
  3. 我何时想使用它,除了代表?
  4. 这是一个ARC的事情还是之前使用?

LLVM编译器3.0引入了四个新的所有权限定符: __strong__autoreleasing __strong__autoreleasing__weak 。 根据规范 ,即使在ARC之外,前三个也是可用的 。

正如Joshua指出的那样,默认情况下所有的指针都暗示在ARC下是__strong 。 这意味着当一个对象被分配给该指针时,只要该指针指向该指针,该对象就会被保留。 对大多数情况来说,这是很好的做法,但是这为保留周期打开了可能性,正如我在这里的回答中所描述的那样。 例如,如果您有一个包含另一个对象作为实例variables的对象,但是该第二个对象与第一个对象具有强连接作为其委托,则两个对象将永远不会被释放。

正因为如此,存在__unsafe_unretained__weak限定符。 他们最常用的用途是委托,你可以用weakunsafe_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这样的东西 。

  1. 不,你也可以用weak的物体,你不拥有。
  2. 不,你也可以在属性上使用unsafe_unretained
  3. 我的理解是, unsafe_unretained项目就像weak ,没有额外的安全性,当它们指向的项目被释放时(以及unsafe_unretained的开销)清除它们。
  4. 这完全是一个ARC事物。

__unsafe_unretained与ARC之前的对象的默认存储相同。 使用ARC时,默认值是__strong这意味着您有一个引用,直到您的引用超出范围。

关于__unsafe_unretained的另一个观察:我的设备上的应用程序崩溃了,而不是在模拟器上,声明为__unsafe_unretained的iVar! 是的,这是ARC迁移代码中的一个错误,但是这是我第一次注意到设备和模拟器之间的差异。