作者热门文章
- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
以下模式在 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 保护开发人员免受可能导致崩溃的常见错误的理念。
最佳答案
unowned
比 weak
有边际性能优势,因为运行时不必跟踪引用以将其转换为 nil
当物体消失时。
关于保留循环(好吧,强引用循环),weak
和 unowned
都不会创建强引用(在 ARC 之前的术语中,既不会增加保留计数)所以不存在引用循环的危险,事实上,这就是为什么需要在闭包中为 self
指定 weak
或 unowned
的原因。
此外,使用unowned
,您可以将引用用作非可选的,因此您不必在闭包中放入任何代码来解包它。
我总是使用 weak
除非有很好的性能理由不这样做。
NB 在你的代码中,我认为两者都不是必需的,因为闭包没有转义,即在函数调用 foo
中对它的引用在 foo 结束后不会持续存在
的范围。
关于ios - 为什么我会使用 unowned self?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46407436/
我是一名优秀的程序员,十分优秀!