【发布时间】:2018-03-06 13:18:51
【问题描述】:
以下模式在 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]代替[***],当你可以保证self在完成时不会为nil时为unowned,当你不确定引用时为weak仍然有效。
我不明白为什么我会冒险使用无主,也许我确信现在引用永远不会为零,但将来可能会改变。我也可能忽略了一个极端情况,错误发生了。我可以很容易地总是使用弱,并在闭包的顶部放置一个守卫,以便能够在没有 ! 的情况下使用 self或?.
无主有什么用?比weak+guard快吗?是语法糖吗?这似乎违背了 Swift 保护开发人员免受可能导致崩溃的常见错误的理念。
【问题讨论】:
-
我不太了解 swift,但是在其他语言中,像
[unowned]这样的概念对于与缺乏引用计数的其他语言(如 C)进行交互非常重要。虽然我不知道为什么要在你呈现的环境中使用它。