gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 22:04:07 24 4
gpt4 key购买 nike

这在 Swift 5.0 中是允许的:

class Person { 
unowned var child: Person?
}

这由 this release notes 支持:

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

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

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

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

Above isn't true anymore

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

  • 弱引用必须键入为可选;它们不保留所引用的对象,但会跟踪所引用的对象,并在该对象不存在时恢复为 nil
  • Unowned references 不保留所引用的对象,也不跟踪所引用的对象,因此您需要防止该对象消失,否则您可能会遇到悬空指针和崩溃。<

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

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

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

class Node {
unowned var parent: Node?
}

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

关于swift - 可选的无主引用与 Swift 5.0 中的弱引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54852878/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com