Swift 5.0 中的可选无主引用与弱引用
Optional unowned reference versus weak in Swift 5.0
这在 Swift 5.0 中是允许的:
class Person {
unowned var child: Person?
}
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 长寿。现在,你可以说出你的意思,这通常是一件好事。
这在 Swift 5.0 中是允许的:
class Person {
unowned var child: Person?
}
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 长寿。现在,你可以说出你的意思,这通常是一件好事。