gpt4 book ai didi

swift - 我们是否应该始终在 Swift 中的闭包内使用 [unowned self]

转载 作者:行者123 更新时间:2023-11-30 10:44:59 27 4
gpt4 key购买 nike

WWDC 2014 第 403 场 session Intermediate Swifttranscript ,有以下幻灯片

enter image description here

演讲者说,在这种情况下,如果我们不使用[unowned self],就会出现内存泄漏。这是否意味着我们应该始终在闭包内使用 [unowned self]

关于line 64 of ViewController.swift of the Swift Weather app ,我不使用[unowned self]。但我通过使用一些 @IBOutlet 来更新 UI,例如 self.Temperatureself.loadingIndicator。这可能没问题,因为我定义的所有@IBOutlet都是。但为了安全起见,我们应该始终使用[unowned self]吗?

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

最佳答案

不,有时候您肯定不想使用[unowned self]。有时您希望闭包捕获 self,以确保在调用闭包时它仍然存在。

示例:发出异步网络请求

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

何时使用unowned selfweak self

您真正想要使用[unowned self][weak self]的唯一时间是当您创建 strong reference cycle 时。 。强引用循环是指存在一个所有权循环,其中对象最终相互拥有(可能通过第三方),因此它们永远不会被释放,因为它们都确保彼此保留在一起。

在闭包的特定情况下,您只需要意识到在其中引用的任何变量都由闭包“拥有”。只要闭包存在,这些对象就一定存在。停止该所有权的唯一方法是执行[unowned self][weak self]。因此,如果一个类拥有一个闭包,并且该闭包捕获了对该类的强引用,那么在该闭包和该类之间就有一个强引用循环。这还包括类是否拥有拥有闭包的东西。

特别是视频中的示例

在幻灯片的示例中,TempNotifier 通过 onChange 成员变量拥有闭包。如果他们没有将 self 声明为 unowned,则闭包也会拥有 self 创建一个强引用循环。

无主之间的区别

unownedweak 之间的区别在于,weak 被声明为可选,而 unowned 则不是。通过声明它weak,你可以处理在某个时刻它在闭包内可能为零的情况。如果你尝试访问一个恰好为零的unowned变量,整个程序将会崩溃。因此,仅当您确信变量在闭包存在时始终存在时才使用 unowned

关于swift - 我们是否应该始终在 Swift 中的闭包内使用 [unowned self],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55917271/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com