gpt4 book ai didi

ios - 为什么我会使用 unowned self?

转载 作者:IT王子 更新时间:2023-10-29 05:21:19 27 4
gpt4 key购买 nike

以下模式在 iOS 应用中经常发生:

class MyViewController: UIViewController {
let myModel = MyModel()

override func viewDidLoad() {
super.viewDidLoad()
myModel.foo() { [***] in
// use self here
}
}
}

class MyModel {
public func foo(complete: () -> Void) {
// do something
complete()
}
}

共识是使用 [unowned self][weak self] 代替 [***], unowned当您可以保证 self 在完成时不会为 nil 并且当您不确定引用是否仍然有效时会很弱。
我不明白的是为什么我会冒险使用 unowned,也许我现在确定引用永远不会为零,但将来可能会改变。我也可能忽略了一个边缘案例,错误发生了。我可以很容易地总是使用 weak,并在闭包的顶部放置一个守卫,以便能够在没有 ! 的情况下使用 self。或者?。
无主有什么用?是不是比weak+guard快?是语法糖吗?这似乎违背了 Swift 保护开发人员免受可能导致崩溃的常见错误的理念。

最佳答案

unownedweak 有边际性能优势,因为运行时不必跟踪引用以将其转换为 nil当物体消失时。

关于保留循环(好吧,强引用循环),weakunowned 都不会创建强引用(在 ARC 之前的术语中,既不会增加保留计数)所以不存在引用循环的危险,事实上,这就是为什么需要在闭包中为 self 指定 weakunowned 的原因。

此外,使用unowned,您可以将引用用作非可选的,因此您不必在闭包中放入任何代码来解包它。

我总是使用 weak 除非有很好的性能理由不这样做。

NB 在你的代码中,我认为两者都不是必需的,因为闭包没有转义,即在函数调用 foo 中对它的引用在 foo 结束后不会持续存在 的范围。

关于ios - 为什么我会使用 unowned self?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46407436/

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