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

Optional unowned reference versus weak in Swift 5.0

这在 Swift 5.0 中是允许的:

class Person { 
    unowned var child: Person?
}

this release notes支持:

unowned and unowned(unsafe) variables now support Optional types. (47326769)

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

An unowned reference is expected to always have a value. As a result, ARC never sets an unowned reference’s value to nil, which means that unowned references are defined using non-optional types.

以上不再正确。 Apple 声明的唯一功能差异是 unowned 引用预计具有与持有该引用的对象相同或更长的生命周期。嗯,很好奇这个的技术用途

当我使用 weak 参考与 optional unowned 参考时有什么区别?或者当引用对象的生命周期较长时,应该使用可选的 unowned 是唯一的区别吗?我希望一定会有更多...

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

why Apple decided to make the unowned an optional type

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

unowned let owner : MyViewController

这里唯一的变化是无主变量可以是一个Optional,这在以前是非法的。此更改解决了烦人的边缘情况,仅此而已。

Above isn't true anymore

是的,是的。和以前完全没有变化:

  • 弱引用必须键入为可选;他们不保留所指的 object,但会跟踪所指的 object,如果 object 不存在,则恢复为 nil
  • Unowned references 不会保留所引用的 object 并且不会跟踪所引用的 object,因此由您来防止 object 消失或您可能会遇到悬空指针和崩溃。

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

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

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

class Node {
    unowned var parent: Node?
}

似乎可以合理地说这个节点可能有也可能没有 parent(因为它可能在图的顶部),但如果它 有一个 parent,parent 应该是无主的(parent 应该保留它的 child,但是 child 不应该保留它的 parent).以前,唯一的方法是将其设为弱引用,这会带来一些不必要的开销,而且是多余的,因为我们绝对可以保证,如果一个节点有 parent,那么 parent 将比 child 长寿。现在,你可以说出你的意思,这通常是一件好事。