可选的无主参考与Swift 5.0中的弱

问题描述 投票:2回答:1

这在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的唯一区别是什么?我希望还有更多......

swift automatic-ref-counting swift5
1个回答
6
投票

您误解了发行说明以及语言变化的含义。

为什么Apple决定将无壳的可选类型

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

unowned let owner : MyViewController

这里唯一的变化是无主变量可以是Optional,这在以前是非法的。这种变化可以解决一个烦人的边缘情况,就是这样。

以上不再适用

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

  • 必须将弱引用键入为Optional;它们不保留所引用的对象,但它们跟踪引用的对象,如果该对象不存在则恢复为nil
  • 无主引用不会保留引用的对象,也不会跟踪引用的对象,因此您可以防止该对象不存在,或者最终可能会出现悬空指针和崩溃。

唯一改变的是,曾经存在一个额外的规则,即无主参考类型不能是可选的。这个规则现在已经消失了。

正如你正确指出的那样,如果无主引用类型是一个Optional,那么它必须是var引用,而不是let引用(因为如果你没有权力从nil更改它,那么将它作为Optional是没有意义的到实际值,反之亦然)。

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

class Node {
    unowned var parent: Node?
}

似乎有理由说这个节点可能有也可能没有父节点(因为它可能位于图的顶部),但是如果它确实有父节点,那么父节点应该是无主的(父节点应保留其子节点,但是孩子不应该保留其父母)。以前,唯一的说法就是使这个弱引用,这需要一些不必要的开销,并且是非常的,因为我们可以绝对保证如果一个节点有一个父节点,父节点将比子节点更长。现在,你可以说出你的意思,这通常是一件好事。

© www.soinside.com 2019 - 2024. All rights reserved.