抱歉,如果这是一个愚蠢的问题。我刚开始学习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
引用了 number73
,number73
引用了 john
。因此,如果删除 weak
关键字,每个对象至少有一个对它的引用,因此不会释放任何对象。
弱引用有助于打破循环。基本上,弱引用不被计算在内,因此只有弱引用的对象将被删除。在示例中,由于 Apartment
实例只有对 Person
实例的弱引用,后者的引用计数为 0,将被释放。之后,Apartment
实例的引用计数也为 0,也将被释放。
关于macos - 为什么 Swift 不自动处理循环引用(强引用循环),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26678204/