只是想确保我做对了:
- 我是否需要
__unsafe_unretain
我不拥有的对象? - 如果一个对象是
__unsafe_unretained
我需要在@property
中使用assign
吗?这是否意味着该对象没有被保留,而只是引用我分配给的对象? - 除了代表,我还想在什么时候使用它?
- 这是 ARC 的东西还是以前使用过?
最佳答案
LLVM Compiler 3.0 引入了四个新的所有权限定符:__strong
、__autoreleasing
、__unsafe_unretained
和 __weak
。根据 the specification,前三个甚至在 ARC 之外也可用。 .
正如 Joshua 所指出的,默认情况下,ARC 下的所有指针都隐含为 __strong
。这意味着当一个对象被分配给该指针时,只要该指针引用它,它就会被保留。这对大多数事情都很好,但它开辟了保留周期的可能性,正如我在回答 here 中所描述的那样。 .例如,如果您有一个对象包含另一个对象作为实例变量,但第二个对象作为其委托(delegate)与第一个对象有强链接,则这两个对象将永远不会被释放。
正是由于这个原因,存在 __unsafe_unretained
和 __weak
限定符。它们最常见的用途是委托(delegate),您可以使用 weak
或 unsafe_unretained
属性为该委托(delegate)定义一个属性(assign
实际上是 unsafe_unretained
),然后通过用 __weak
或 __unsafe_unretained
标记相应的实例变量来匹配它。这意味着委托(delegate)实例变量仍将指向第一个对象,但不会导致该对象被保留,从而打破保留循环并允许释放两个对象。
除了委托(delegate)之外,这对于打破可能在您的代码中形成的任何其他保留周期很有用。有用的是,Leaks 工具现在包含一个 Cycles View ,它以图形方式显示它在您的应用程序中发现的保留周期。
__unsafe_unretained
和 __weak
都可以防止对象的保留,但方式略有不同。对于__weak
,指向对象的指针在释放它指向的对象时会转换为nil
,这是非常安全的行为。顾名思义,__unsafe_unretained
将继续指向对象所在的内存,即使在对象被释放后也是如此。由于访问该已释放对象,这可能会导致崩溃。
那你为什么要使用 __unsafe_unretained
呢?不幸的是,__weak
仅支持 iOS 5.0 和 Lion 作为部署目标。如果您想重新定位到 iOS 4.0 和 Snow Leopard,您必须使用 __unsafe_unretained
限定符,或者使用 Mike Ash 的 MAZeroingWeakRef 之类的东西。 .
关于objective-c - ARC - __unsafe_unretained 的含义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8592289/