在WWDC 2014年第403 Intermediate Swifttranscript次会议上,出现了以下幻灯片

在此处输入图像描述

演讲者说,在这种情况下,如果我们不在那里使用[unowned self],那将是内存泄漏.这是否意味着我们应该始终使用[unowned self]个内部闭合?

line 64 of ViewController.swift of the Swift Weather app,我不用[unowned self].但我使用self.temperatureself.loadingIndicator@IBOutlet来更新UI.这可能没问题,因为我定义的所有@IBOutlet都是weak.但为了安全起见,我们应该一直使用[unowned self]吗?

class TempNotifier {
  var onChange: (Int) -> Void = {_ in }
  var currentTemp = 72
  init() {
    onChange = { [unowned self] temp in
      self.currentTemp = temp
    }
  }
}

推荐答案

不,有些时候你肯定不想用[unowned self].有时,要确保你仍在按顺序捕捉自己.

示例:发出异步网络请求

如果您正在发出一个异步网络请求,那么您希望在请求完成时闭包保留self.该对象可能已经被释放,但您仍然希望能够处理请求.

When to use unowned self or weak self

你唯一真正想使用[unowned self][weak self]的时候是创建strong reference cycle.强引用循环是指存在所有权循环,对象最终相互拥有(可能通过第三方),因此它们永远不会被解除分配,因为它们都在确保彼此保持不变.

在闭包的特定情况下,您只需要意识到在闭包中引用的任何变量都会被闭包"拥有".只要关闭在附近,这些对象就一定在附近.阻止这种所有权的唯一方法是做[unowned self][weak self].因此,如果一个类拥有一个闭包,并且该闭包捕获了对该类的强引用,那么在闭包和该类之间就有一个强引用循环.这还包括类是否拥有某个拥有闭包的对象.

特别是在视频中

在幻灯片上的示例中,TempNotifier通过onChange成员变量拥有闭包.如果他们不将self声明为unowned,那么关闭也将拥有self,从而创建一个强大的参考循环.

Difference between unowned and weak

unownedweak之间的区别在于weak被声明为可选,而unowned不是.通过将其声明为weak,您可以处理在某个时刻闭包中可能为零的情况.如果你试图访问一个恰好为零的unowned变量,它将使整个程序崩溃.所以只有当你为正时才使用unowned,当闭包存在时,变量总是存在

Swift相关问答推荐

为表单部分赋予背景 colored颜色 /渐变

如何取消正在视图修改器中运行的任务

在Swift中,是否只有iOS版本超过15才能导入Swift包?

它是RxSwift中直接用于可扩展视图的有效的可扩展BehaviorRelay值?

String.Index encodedOffset已弃用,但建议的替代方案不起作用

如何在SwiftUI中做出适当的曲线?

NavigationLink和ObservableObject的动画片段

使用 @resultBuilder 的通用 buildList 函数

更改 SwiftUI 中按钮矩阵的填充 colored颜色

使用UICollectionViewFlowLayout创建水平的UICollectionView,并同时将单元格对齐到左边和右边的能力

如何删除快速处理消息

使用 WrappingHStack 文本溢出到新行

如何打印出此 struct 中的数据?

在 Vapor 4 中使用协议的通用流利查询

try 制作一个 Swift 扩展来替换字符串中的多次出现

如何确定扩展中的具体类型?

ZStack 中的 ProgressView 与 View 的行为不同

在 Swift 中返回实例类型

swift 3 错误:参数标签 '(_:)' 不匹配任何可用的重载

迭代 Firebase 中的子快照