【发布时间】:2017-10-23 00:04:25
【问题描述】:
我正在研究 Swift,我对在 Swift 中使用 unowned 和 weak 关键字进行内存管理有点困惑。
谁能帮我了解在哪里使用unowned?
提前致谢!
【问题讨论】:
标签: swift memory-management automatic-ref-counting
我正在研究 Swift,我对在 Swift 中使用 unowned 和 weak 关键字进行内存管理有点困惑。
谁能帮我了解在哪里使用unowned?
提前致谢!
【问题讨论】:
标签: swift memory-management automatic-ref-counting
最重要的区别是无主变量在 Swift 中非常危险。
weak 是可选类型,unowned 不是。
这意味着您可以创建使用弱作为逻辑一部分的代码。 (想想只有当视图控制器仍然显示在屏幕上时才会发生的异步操作,当代码运行时,如果引用是“弱”的,如果代码编写正确,它将静默失败而不会导致任何其他问题)
另一方面,当一个变量是无主的时,你基本上是在说这个变量总是会引用一些东西。而且不像weak,如果你调用它并且没有任何东西它会崩溃。
您通常永远不想使用无主。 (我没有遇到任何我必须这样做的情况)。另一方面,“弱自身”变量在编写块时很常见。
你可以看到这个问题的一个很好的解释:
Shall we always use [unowned self] inside closure in Swift
编辑:实际上,请检查投票最多的第一个和第二个答案。它们对何时使用 unowned 及其工作方式提供了清晰的解释。第二个甚至有图片!
【讨论】:
开发者网站上有一些很好的例子,请查看link
就 Apple Docs 所涉及的块而言:
在闭包时将闭包中的捕获定义为无主引用 并且它捕获的实例将始终相互引用,并且将 总是同时被释放。
反之,将捕获定义为弱引用,当捕获 reference 可能在将来的某个时候变为 nil。弱引用 总是一个可选类型,当 他们引用的实例被释放。这使您能够检查 它们存在于闭包体内。
总结 使用弱引用,只要它是有效的 引用在其生命周期的某个时间点变为 nil。反过来, 当您知道引用永远不会使用时,请使用无主引用 一旦在初始化期间设置为 nil。”
【讨论】: