gpt4 book ai didi

swift - Swift 中的 weak vs unowned。内部差异是什么?

转载 作者:IT王子 更新时间:2023-10-29 05:19:00 29 4
gpt4 key购买 nike

我了解 Swift 中 weakunowned 的用法和表面差异:

我见过的最简单的例子是,如果有一个 Dog 和一个 Bone,那么 Bone 可能有一个弱引用Dog(反之亦然),因为它们可以彼此独立存在。

另一方面,对于HumanHeartHeart可能有一个unowned code> 对人的引用,因为一旦 Human 变成...“取消引用”,就无法再合理地访问 Heart。这与 CustomerCreditCard 的经典示例。

因此,这不是关于此问题的重复问题。


我的问题是,拥有两个如此相似的概念有什么意义?本质上 99% 相同的事物需要使用两个关键字的内部差异是什么?问题是为什么存在差异,而不是差异是什么。

鉴于我们可以像这样设置一个变量:weak var customer: Customer!unowned 变量是非可选的优势是一个有争议的问题。

The only practical advantage I can see of using unowned vs implicitly unwrapping a weak variable via ! is that we can make unowned references constant via let.

...也许编译器可以因此做出更有效的优化。

这是真的吗,还是在幕后发生了其他事情,为保留这两个关键字提供了令人信服的论据(尽管细微的区别是——基于 Stack Overflow 流量——显然让新手和有经验的开发人员都感到困惑)。

我非常想听听从事 Swift 编译器(或其他编译器)工作的人们的意见。

最佳答案

My question is, what is the point in having two such similar concepts? What are the internal differences that necessitate having two keywords for what seem essentially 99% the same thing?

它们一点也不相似。它们尽可能地不同。

  • weak 是一个高度复杂的概念,在引入 ARC 时引入。它执行近乎奇迹般的任务,允许您防止保留循环(通过避免强引用),而不会在引用的对象不存在时因悬挂指针而崩溃——这在 ARC 之前一直发生介绍。

  • unowned 另一方面,是 non-ARC weak(具体来说,它与非 ARC assign)。在引入 ARC 之前,它是我们过去不得不冒的风险,它是导致如此多崩溃的原因。这是非常危险的,因为如果引用的对象不存在,您可能得到悬空指针和崩溃。

差异的原因是weak,为了创造它的奇迹,涉及很多额外的运行时开销,由编译器在幕后插入. weak 引用是内存管理的。特别是,运行时必须维护一个以这种方式标记的所有引用的暂存器,跟踪它们,以便如果弱引用的对象不存在,运行时可以找到该引用并将其替换为nil 以防止悬空指针。

因此,在 Swift 中,一个 weak 引用总是指向一个 Optional(正是这样它可以被 nil 替换)。这是额外的开销来源,因为使用 Optional 需要额外的工作,因为它必须始终被解包才能完成任何事情。

因此,unowned 在适用的情况下始终是首选。但除非绝对安全,否则切勿使用它!使用 unowned,您将放弃自动内存管理和安全。你是在故意回到 ARC 之前的糟糕日子。

在我的使用中,常见的情况出现在闭包需要包含 self捕获列表 以避免保留循环的情况下。在这种情况下,几乎总是可以在捕获列表中说[unowned self]。当我们这样做时:

  • 这对程序员来说更方便,因为没有什么可以解包的。 [weak self] 将是一个需要解包才能使用的 Optional。

  • 它更有效,部分原因是相同的(解包总是添加额外的间接级别),部分原因是它是运行时暂存器列表跟踪的一个较少的弱引用。

关于swift - Swift 中的 weak vs unowned。内部差异是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42842336/

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