迅速。无所不在的(绝对)唯一特定优势是否超过弱,绩效?

时间:2017-01-24 14:25:14

标签: swift reference weak-references

在Swift中,我们有正常的默认输入

  • 对象根本不能成为零。

我们的打字很弱

  • 对象可以变为零。如果对象变为nil,则指针自动变为nil,因此您知道对象变为nil

我们有无主打字

  • 对象可以变为零。如果物体变为零,你的指针什么都不会发生 - 如果你试图使用它,你就会被搞砸

(所以:通过推论:你可以使用的唯一一次"无主"如果你"绝对知道"对象将永远不会变为零。)

现在:

在我看来,以下句子,

绝对是真的......

绝对我的意思是,真的,真的,绝对地,归结为最深刻的哲学关注真实......

"无主和弱的唯一区别在于表现。由于无主,没有检查,它更快。绝对没有其他区别。"

因而是逻辑推论:

"有绝对,没有理由使用无主,除非需要额外的性能超过弱者。"

{旁白 - 我能想到的唯一其他差异在于自我记录意义。如果我使用无主,它会让我的开发人员知道某些事情;让我们暂时搁置这个问题。)

所以我的问题很简单,非常准确,非常具体:上面是大胆的句子" true" (在"完全,非常,壮观"真正的真实感)。

3 个答案:

答案 0 :(得分:3)

粗体句子不正确

Weak是可选的,可以随时设置。

Unowned是非可选的,但可以是零。如果发生这种情况,你称之为你的应用程序崩溃。它必须在初始化期间设置。

另一个不同之处在于表现,正如作者所说。 Unowned不进行任何检查,并且比weak稍快。

它更好地显示了类之间的关系。

您可以查看此SO问题以获取更多详细信息:What is the difference between a weak reference and an unowned reference?

答案 1 :(得分:3)

我同意Yannick的观点。你的大胆陈述是不正确的。无主参考必须在其生命周期内有效。在-Ounchecked程序中,未能保持此前提条件的行为是未定义的。我不是故意"它崩溃了。"我的意思是它不是一个结构良好的计划;它未定义它的作用。即使在-Ounchecked下,弱引用也不会因其释放而生成未定义的行为。

使用unowned是程序员声明该引用在其整个生命周期内都有效。这甚至都不是Type!断言的。 !类型只是断言引用在访问它时是有效的。这就是为什么你无法对无主人的x == nil进行测试的原因。它不是可选的。它不是伪装的可选" (如Type!)。它必须始终有效。

  

与弱引用不同,当另一个实例具有相同的生命周期或更长的生命周期时,将使用无主引用。 ...无主参考​​预计始终具有值。 - [The Swift Programming Language]

那么对于你最深刻的哲学,"无主的包括一个不存在于弱势中的先决条件。这个先决条件存在于程序之外,必须由程序员而不是编译器证明,以确保程序结构良好。

对于是否有理由使用unowned,我们肯定会采取最绝对的立场(如您的问题所示)。在已知前提条件为真的情况下,它是最严格的类型。 weak类型比unowned弱;它表达的前提条件较少。良好的类型理论鼓励我们使用最强(最严格;最少的法律价值)类型,unowned是比weak更强的类型。

在非绝对主义者("实践")意义上,选择更强类型的结果是更简单的代码。当你使用weak时,你必须不断地重新断言每次使用它时都不是nil的前提条件并处理它的情况(可能插入fatalError只是重新发明unowned有更多工作)。使用unowned可以让您断言此前置条件一次。这样可以创建更简单,更正确的代码。我从未使用unowned来提高速度。我总是用它来避免一遍又一遍地回答#34;但如果它没有问题怎么办?"在代码里,它绝不能是零。

答案 2 :(得分:0)

来自迅捷文档

  

“在某些情况下,Swift还提供了不安全的无主引用   需要禁用运行时安全检查-例如,为了提高性能   原因。与所有不安全的操作一样,您要承担责任   用于检查该代码的安全性。

     

您通过写unowned(unsafe)来表示不安全的无主引用。   如果您尝试在实例之后访问不安全的无主引用   它所指的已被释放,您的程序将尝试访问   实例曾经所在的内存位置,这是不安全的   操作。”

似乎只有在您使用无所有权(不安全)的情况下才能获得性能提升,并且默认情况下,我们使用无权(安全)。

This is from one of the answer

  

unowned(safe)是一个非所有者引用,它在访问时断言   该对象仍然存在。有点像一个弱的可选参考   用x隐式解开了!每次访问时。   无所有权(不安全)就像__unsafe_unretain在ARC中一样-它是非所有者   参考,但没有运行时检查对象是否仍然存在   在访问时,悬挂的引用将进入垃圾内存。   当前,无主始终是无主(安全)的同义词,但是   目的是将其优化为-Ofast中的无主(不安全)   在禁用运行时检查时构建。