11

这在 Swift 5.0 中是允许的:

class Person { 
    unowned var child: Person?
}

此发行说明支持这一点:

unowned 和 unowned(unsafe) 变量现在支持可选类型。(47326769)

在 Swift 4.2 及之前版本中,我完全理解了 weak 和 unowned 之间的区别。但是,我不确定为什么 Apple 决定制作unownedanoptional类型。即使在文档(Swift 5.0 的文档)中,这个实现的“提案”(我什至在哪里可以找到带有添加可选无主引用的动机的提案?)也没有更新,因为它说:

一个无主的引用应该总是有一个值。因此,ARC 永远不会将无主引用的值设置为 nil,这意味着无主引用是使用非可选类型定义的。

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

weak当我使用参考与可选 参考时有什么区别unownedunowned或者当引用对象具有更长的生命周期时,应该使用可选的唯一区别是什么?我希望必须有更多...

4

1 回答 1

13

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

为什么 Apple 决定将 unowned 设为可选类型

他们没有。你可以,而且通常会,仍然说

unowned let owner : MyViewController

这里唯一的变化是 unowned 变量可以是 Optional,这在以前是非法的。此更改处理了令人讨厌的边缘情况,仅此而已。

以上不再正确

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

  • 弱引用必须输入为 Optional;它们不保留引用的对象,但它们跟踪引用的对象,并nil在该对象不存在时恢复。
  • 无主引用不保留所引用的对象,也不跟踪所引用的对象,因此由您决定防止该对象消失,否则您可能会以悬空指针和崩溃告终。

唯一改变的是以前有一个附加规则,即无主引用类型不能是可选的。现在这条规则已经没有了。

正如您正确指出的那样,如果 unowned 引用类型Optional,则这必须是var引用,而不是let引用(因为如果您无权将其更改nil为实际,那么将其设为 Optional 将毫无意义值,反之亦然)。

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

class Node {
    unowned var parent: Node?
}

可以合理地说这个节点可能有也可能没有父节点(因为它可能位于图表的顶部),但如果它确实有父节点,则该父节点应该是无主的(父节点应该保留其子节点,但孩子不应保留其父母)。以前,唯一的说法是使它成为一个弱引用,这会带来一些不必要的开销,而且是不恰当的,因为我们可以绝对保证,如果一个节点有父节点,则父节点的寿命会比子节点长。现在,您可以说出您的意思,这通常是一件好事。

于 2019-02-24T14:31:47.580 回答