在 Swift 中,我们有正常的默认类型
我们有弱类型
- 该对象可以变为零。如果对象变成nil,你的指针自动变成nil,所以你知道对象变成了nil
我们有无主打字
- 该对象可以变为零。如果对象变成 nil,你的指针不会发生任何事情 - 如果你尝试使用它,你就完蛋了
(因此:推论:你可以使用“无主”的唯一一次是如果你“绝对知道”该对象永远不会变成零。)
现在:在我看来,下面这句话是绝对地真的……我的意思是,真的,真的,绝对,深入到最深层次的哲学问题 true...
“无主和弱之间的唯一区别是性能。由于无主没有检查,所以速度更快。绝对没有其他区别。”
因此逻辑推论:
“有,绝对地,没有理由使用 unowned,除非需要额外的性能超过弱。”
(旁白 - 我能想到的唯一的其他区别是在自我记录的意义上。如果我使用无主,它会提示我的开发人员同事注意某些事情;让我们搁置现在这个问题。)
所以我的问题很简单,非常准确,非常具体:上面的粗体句子是“true”(在“完全、非常、壮观”的真实意义上)。
我同意雅尼克的观点。你大胆的说法是不正确的。无主引用must终生有效。在一个-Ounchecked
程序中,未能维持此前提条件是未定义的行为。我的意思不是“它崩溃了”。我的意思是这不是一个格式良好的程序;它的作用是未定义的。弱引用不能因其释放而产生未定义的行为,即使在-Ounchecked
.
Using unowned
是程序员声明该引用在其整个生命周期内有效。这根本就不算什么Type!
断言。!
类型只是断言引用在访问时有效。这就是为什么你无法测试x == nil
在无主的。它不是可选的。它不是“变相可选”(比如Type!
)。它必须始终有效。
然而,与弱引用不同的是,当另一个实例具有相同的寿命或更长的寿命。 ...无主引用预计总是有价值的. —— [Swift 编程语言]
因此,对于你的“最深层次的哲学”来说,无主包括一个弱者不存在的先决条件。这个前提条件存在于程序之外,并且必须由程序员而不是编译器来证明,以确保程序的格式良好。
是否有使用的理由unowned
,如果我们采取绝对的立场(就像你的问题一样),那肯定是有的。在已知前提条件为真的情况下,它是最严格的类型。weak
是比以下更弱的类型unowned
;它表达的先决条件较少。好的类型理论鼓励我们尽可能使用最强的(最具限制性的;最少的法律价值)类型,并且unowned
是比以下更强的类型weak
.
从非绝对主义(“实用”)意义上来说,选择更强的类型的结果是更简单的代码。当你使用weak
,你必须不断地重新断言它不是的前提nil
每次你使用它并处理它所在的情况时(可能插入fatalError
这只是重新发明unowned
有更多的工作)。使用unowned
让您断言此前提条件一次。这会创建更简单、更正确的代码。我从来没有用过unowned
为了速度。我总是用它来避免一遍又一遍地回答“但是如果它为零怎么办?”在代码中它绝不能为零。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)