代码之家  ›  专栏  ›  技术社区  ›  J. Doe

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

  •  1
  • J. Doe  · 技术社区  · 6 年前

    这在Swift 5.0中是允许的:

    class Person { 
        unowned var child: Person?
    }
    

    这一点得到了以下方面的支持: this release notes :

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

    在Swift 4.2和之前的版本中,我完全理解弱者和无主者之间的区别。然而,我不知道苹果为什么决定做这件事 unowned optional 类型即使在 docs (这些是Swift 5.0的文档)此已实施的“提案”(我在哪里可以找到动机是添加可选无主参考的提案?)没有更新,因为它说:

    ARC从不将无主引用值设置为nil,这意味着 无主引用是使用非可选类型定义的。

    上面的话不再是真的了。苹果公司声明的唯一功能区别是 无主 引用的生命周期应与持有该引用的对象的生命周期相等或更长。嗯,我对这个的技术用途很好奇。

    当我使用一个 weak 参考vs 无主 无主 当引用对象的生存期较长时,是否应使用?我想肯定还有更多。。。

    1 回复  |  直到 6 年前
        1
  •  13
  •   matt    6 年前

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

    为什么苹果决定将无人拥有的手机作为可选型号

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

    unowned let owner : MyViewController
    

    这里唯一的变化是无主变量 是可选的,以前是非法的。这一变化处理了一个恼人的边缘情况,仅此而已。

    上面的话不再是真的了

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

    • 弱引用必须键入为可选;它们不会保留引用的对象,但会跟踪引用的对象,并恢复为 nil 如果那个物体消失了。
    • 无主引用不会保留引用的对象,也不会跟踪引用的对象,因此由您来防止该对象不存在,否则可能会导致指针悬空和崩溃。

    唯一改变的是,过去有一条附加规则,即无主引用类型不能是可选的。这条规则现在已经不复存在了。

    正如您正确指出的,如果无主引用类型 一个可选的,这必须是一个 var 参考资料,而不是 let 引用(因为如果您没有权限更改它,那么将其作为可选项是没有意义的) 实际值,反之亦然)。

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

    class Node {
        unowned var parent: Node?
    }
    

    如果有父项,则该父项应为无主(父项应保留其子项,但子项不应保留其父项)。在此之前,唯一的方法是将其设置为弱引用,这会带来一些不必要的开销,而且是无用的,因为我们可以绝对保证,如果节点有父节点,则父节点将比子节点活得长。现在,你可以说出你的意思,这通常是件好事。

    推荐文章