【发布时间】:2017-08-08 02:45:21
【问题描述】:
我了解weak 和unowned 在Swift 中的用法和表面上的区别:
我见过的最简单的例子是,如果有Dog 和Bone,Bone 可能对Dog 有弱引用(反之亦然),因为每个都可以独立存在彼此的。
另一方面,在Human 和Heart 的情况下,Heart 可能有一个unowned 对人类的引用,因为一旦Human 变为..."取消引用”,Heart 不能再被合理地访问。这和Customer 和CreditCard 的经典示例。
所以这不是重复的问题。
我的问题是,拥有两个如此相似的概念有什么意义?有哪些内部差异需要使用两个关键字来表示本质上 99% 相同的东西?问题是为什么存在差异,而不是差异是什么。
鉴于我们可以像这样设置一个变量:weak var customer: Customer!,unowned 变量是非可选的优势是一个有争议的问题。
使用
unowned与通过!隐式展开weak变量相比,我可以看到的唯一实际优势是我们可以通过let使unowned引用保持不变。
...也许编译器可以因此做出更有效的优化。
这是真的吗,还是幕后发生的其他事情为保留这两个关键字提供了一个令人信服的论据(尽管细微的区别——基于 Stack Overflow 流量——显然会让新手和有经验的开发人员都感到困惑)。
我最想听听从事 Swift 编译器(或其他编译器)工作的人的意见。
【问题讨论】:
-
@DalijaPrasnikar 不同意。 OP 询问实现方式有何不同;您链接的问题是关于概念(即用法)差异。
-
注意:对于每个引用,都需要注意重要的性能影响:stackoverflow.com/questions/58635303/…
标签: swift compiler-optimization weak-references memory-safety