objective-c - ARC - __unsafe_unretained 的含义?

标签 objective-c ios macos xcode4 automatic-ref-counting

只是想确保我做对了:

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

最佳答案

LLVM Compiler 3.0 引入了四个新的所有权限定符:__strong__autoreleasing__unsafe_unretained__weak。根据 the specification,前三个甚至在 ARC 之外也可用。 .

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

正是由于这个原因,存在 __unsafe_unretained__weak 限定符。它们最常见的用途是委托(delegate),您可以使用 weakunsafe_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/

相关文章:

swift NSEvent 不工作

iphone - 如何将 NSData 作为 NSString 传递并取回?

ios - 防止 UITableViewCells 出队和重新加载

objective-c - 如何使用静态库分发我的 OSX Cocoa 应用程序?

ios - 将子 UIViewConroller 添加到 UITabBarController

ios - 打开 Youtube 应用程序并返回我的应用程序

macos - OS-X 上的 GNU 链接器-GAS

objective-c - 按住上下文菜单 (NSMenu)。单击窗口上的任意位置时不允许关闭上下文菜单

iphone - 使用 KVC/valueForKey 与属性访问 NSManagedObject 字段 - 哪个更好?

iphone - 从 CGAffineTransform 中查找比例值