在 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,因为您不能确定引用是否仍然有效。
我不明白的是,为什么我要冒着使用unowned的风险,也许现在我确定该引用永远不会为nil,但这可能会在将来改变。我也可能忽略了一些边缘情况,误解发生。我同样可以始终使用weak,在闭包顶部放置一个guard以便能够使用self而不需要!或?。
unowned有什么用处呢?它比weak + guard更快吗?它是语法糖吗?它似乎违背了Swift保护开发人员免受可能导致崩溃的常见错误的哲学。
[unowned]
这样的概念对于与缺乏引用计数的C等其他语言进行接口交互非常重要。虽然我不知道为什么在你所提供的环境中会使用它。 - Cort Ammon