ARC - __unsafe_unretained 的含义?

2024-04-25

只是想确保我做对了:

  1. 我需要吗__unsafe_unretain不属于我的物品?
  2. 如果一个物体是__unsafe_unretained我需要使用吗assign in the @property?这是否意味着该对象没有被保留,而只是引用我分配给的对象?
  3. 除了代表之外我什么时候想使用它?
  4. 这是 ARC 的东西还是以前用过?

LLVM 编译器 3.0 引入了四个新的所有权限定符:__strong, __autoreleasing, __unsafe_unretained, and __weak。前三个甚至在 ARC 之外也可用,根据规格 http://clang.llvm.org/docs/AutomaticReferenceCounting.html.

正如 Joshua 所指出的,默认情况下所有指针都被暗示为__strong在 ARC 下。这意味着当一个对象被分配给该指针时,只要该指针引用它,它就会被保留。这对于大多数事情来说都很好,但它开启了保留周期的可能性,正如我在回答中所描述的那样here https://stackoverflow.com/a/6388601/19679。例如,如果您有一个对象包含另一个对象作为实例变量,但第二个对象作为其委托具有返回到第一个对象的强链接,则这两个对象将永远不会被释放。

正是由于这个原因,__unsafe_unretained and __weak存在限定符。它们最常见的用途是用于委托,您可以使用以下命令为该委托定义一个属性:weak or unsafe_unretained属性 (assign是有效地unsafe_unretained),然后通过标记相应的实例变量来匹配它__weak or __unsafe_unretained。这意味着委托实例变量仍将指向第一个对象,但不会导致该对象被保留,从而打破保留周期并允许释放两个对象。

除了委托之外,这对于打破代码中可能形成的任何其他保留周期很有用。有用的是,Leaks 工具现在包含一个 Cycles 视图,它以图形方式显示它在应用程序中发现的保留周期。

Both __unsafe_unretained and __weak防止物体滞留,但方式略有不同。为了__weak,指向对象的指针将转换为nil释放它所指向的对象,这是非常安全的行为。顾名思义,__unsafe_unretained即使在对象被释放之后,也会继续指向对象所在的内存。这可能会因访问该已释放的对象而导致崩溃。

你为什么会使用__unsafe_unretained然后?很遗憾,__weak仅支持 iOS 5.0 和 Lion 作为部署目标。如果你想回到 iOS 4.0 和 Snow Leopard,你必须使用__unsafe_unretained限定符,或者使用类似 Mike Ash 的东西MAZeroing弱引用 http://www.mikeash.com/pyblog/friday-qa-2010-07-16-zeroing-weak-references-in-objective-c.html.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ARC - __unsafe_unretained 的含义? 的相关文章

随机推荐