macos - 为什么 Swift 不自动处理循环引用(强引用循环)

标签 macos swift garbage-collection circular-reference

抱歉,如果这是一个愚蠢的问题。我刚开始学习swift。我的日常工作主要使用 php。 Apple Store 的 Swift 教科书使用以下示例(我将其修改为较短的版本)来演示弱引用的用法:

class Person {
    var apartment: Apartment?;
}

class Apartment {
    weak var tenant: Person?;
}

var john: Person?;           john = Person();
var number73: Apartment?;    number73 = Apartment();
john!.apartment = number73;  number73!.tenant = john;      //circular reference here

john = nil;   number73 = nil;         //deference from static variable names

在上面的公寓类定义中,如果 weak 关键字从 var tenant 中移除,它在下面的代码中创建一个强引用循环,这样两个实例就不会被 GC 处理掉。但是,在我看来,GC 确实不需要弱引用的指示。很明显,这两个实例不能从当前范围内的任何变量或任何静态变量链接,因此可以安全地处理它们。

为什么 Swift 会强制语法?我能弄清楚的唯一优点是弱关键字突出了逻辑,因此代码更易于阅读。

最佳答案

Swift 不使用标记清除垃圾收集。它使用引用计数。在引用计数中,计算每个对象有多少引用:每次创建对对象的新引用时,引用计数都会增加,而每次删除对对象的引用时,引用计数都会减少。一旦一个对象的引用为零,它就会被释放。引用计数的主要弱点之一是不处理循环结构。

在您的示例中,john 引用了 number73number73 引用了 john。因此,如果删除 weak 关键字,每个对象至少有一个对它的引用,因此不会释放任何对象。

弱引用有助于打破循环。基本上,弱引用不被计算在内,因此只有弱引用的对象将被删除。在示例中,由于 Apartment 实例只有对 Person 实例的弱引用,后者的引用计数为 0,将被释放。之后,Apartment 实例的引用计数也为 0,也将被释放。

关于macos - 为什么 Swift 不自动处理循环引用(强引用循环),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26678204/

相关文章:

python - 我的 Mac 上的 Python 版本是什么?

macos - 自动化 OSX Mac App Store 构建

swift - 检测何时通过拖放删除了 NSStatusItem

node.js - 顺序递增跳数

ios - Swift Progress View 值传递函数

java - JVM 是否在系统中存储内存?如果有,如何清除?

ios - 如何在点击时更改 UITableViewCell 的部分位置

ios - 如何在 Swift 中通过按下按钮来增加标签值

java - 此 Java 代码中有多少对象符合垃圾回收条件?

node.js - nodejs垃圾收集输出