只是想确保我做对了:

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

推荐答案

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

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

正是由于这个原因,才有了__unsafe_unretained__weak限定符.它们最常见的用途是用于委托,您可以使用weakunsafe_unretained属性为该委托定义一个属性(assign实际上是unsafe_unretained),然后通过将相应的实例变量标记为__weak__unsafe_unretained来匹配该属性.这意味着委托实例变量仍将指向第一个对象,但不会导致保留该对象,从而打破保留循环并允许释放这两个对象.

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

__unsafe_unretained__weak都可以防止对象保留,但方式略有不同.对于__weak,指向对象的指针在其指向的对象释放时将转换为nil,这是非常安全的行为.顾名思义,__unsafe_unretained将继续指向对象所在的内存,即使在它被释放之后也是如此.这可能会由于访问该释放的对象而导致崩溃.

那你为什么要用__unsafe_unretained呢?遗憾的是,只有iOS 5.0和Lion才支持__weak作为部署目标.如果你想要回到iOS 4.0和雪豹,你必须使用__unsafe_unretained限定符,或者使用像Mike Ash的MAZeroingWeakRef这样的东西.

Ios相关问答推荐

如何遮罩,动画和添加阴影到CAShapeLayer?

preferredCompactColumn作为NavigationSplitViewColumn.sidebar传递,但仍能在iOS上看到详细信息页面

如何在将EXPO更新到50.0后修复react 本机错误

SWIFT根据地球坐标修改 node 旋转

如何在 Swift 中存储具有关联值的协议?

Flutter iOS 键盘问题:. TextInputType.number 中缺少字符

在iOS中使用Swift,即时更改应用语言后,立即改变外观会出现问题

iOS - 判断开发者模式是否开启 (Swift)

如何为 XCTest、SwiftUI 预览等初始化带有 @MainActor 注释的 Swift 类

如何将标准化坐标系中的点的位置转换为具有相对位置的常规坐标系?

使用 AVAudioPlayer 播放声音

如何用 Swift 圆化 UILabel 的边缘

为信用卡输入格式化 UITextField,例如 (xxxx xxxx xxxx xxxx)

iOS 应用程序中的手动语言 Select (iPhone 和 iPad)

Xcode / iOS模拟器:手动触发重大位置更改

iOS UITextView 或 UILabel 带有可点击的动作链接

ARC - __unsafe_unretained 的含义?

使用 xib 创建可重用的 UIView(并从情节提要中加载)

在两个或多个 iPhone 应用程序之间共享数据

如何创建 Select 器数组