可选的无主引用与Swift 5.0中的弱引用

时间:2019-02-24 14:28:14

标签: swift automatic-ref-counting swift5

这在Swift 5.0中是允许的:

class Person { 
    unowned var child: Person?
}

this release notes支持此功能:

  

无主和无主(不安全)变量现在支持可选类型。   (47326769)

我完全了解Swift 4.2和以前版本中弱者和无人者之间的区别。但是,我不确定Apple为什么决定将unowned设为optional类型。即使在docs(这是Swift 5.0的文档)中,该实现的“建议”(我什至可以在其中找到打算添加可选的未拥有引用的建议?)也没有更新,因为它说:

  

一个无主引用应该总是有一个值。结果是,   ARC从未将未拥有的引用的值设置为nil,这意味着   没有所有权的引用是使用非可选类型定义的。

以上不再是真的。 Apple声明的唯一功能差异是,unowned引用的寿命应与持有该引用的对象相同或更长。好吧,我对此的技术用途很好奇。

使用weak引用与可选 unowned引用有什么区别?还是在引用对象的生存期较长时应使用可选unowned的唯一区别?我希望还会有更多...

1 个答案:

答案 0 :(得分:4)

您误解了发行说明和语言更改的含义。

  

为什么苹果公司决定将无主物品设为可选类型

他们没有。您可以而且通常会说

unowned let owner : MyViewController

此处唯一的变化是,未拥有的变量可以是Optional,以前是非法的。这项更改可解决一个烦人的边缘情况,仅此而已。

  

以上不再是事实

是的。事情与以前完全没有改变:

  • 弱引用必须键入为Optional;它们不会保留所引用的对象,但是会跟踪所引用的对象,如果该对象不存在,则会还原为nil
  • 未拥有的引用不会保留所引用的对象,也不会跟踪所引用的对象,因此您有责任防止该对象消失,否则可能会导致指针悬空和崩溃。 li>

唯一更改的是,曾经有一个附加规则,即无主引用类型不能为Optional。该规则现在消失了。

正如您正确指出的那样,如果未拥有的引用类型 是可选的,则它必须是var引用,而不是let引用(因为此引用是如果您无权将可选值从nil更改为实际值,反之亦然,则Optional是没有意义的。

一个典型的用例非常类似于您自己提供的:

class Node {
    unowned var parent: Node?
}

可以合理地说这个节点可能有也可能没有父节点(因为它可能在图的顶部),但是如果它确实有,则该父节点应该无人拥有(父母应保留其子女,但子女不应保留其父母)。以前,唯一的说法就是使它成为弱引用,这会带来一些不必要的开销,并且很简单,因为我们可以绝对保证,如果节点具有父级,则父级将超过子级。现在,您可以说出您的意思了,这通常是一件好事。