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
在上述公寓类定义中,如果 弱 关键字已从 var tenant 中移除,则在以下代码中创建一个强引用循环,以便GC不会处理这两个实例。但是,在我看来GC确实不需要弱参考的指示。很明显,这两个实例不能与当前作用域中的任何变量或任何静态变量链接,因此可以安全地处理它们。
为什么服用Swift强制语法?我能弄清楚的唯一优势是弱关键词强调逻辑,因此代码更容易阅读。
答案 0 :(得分:16)
Swift不使用标记和清除垃圾回收。它使用引用计数。在引用计数中,计算每个对象有多少引用:每次创建对象的新引用时,引用计数递增,并且每次删除对对象的引用时,引用计数递减。一旦对象具有零引用,它就被处置掉。引用计数的一个主要缺点是不会丢弃循环结构。
在您的示例中,john
引用了number73
,number73
引用了john
。因此,如果删除weak
关键字,则每个对象至少有一个对象的引用,因此不会处理任何对象。
弱引用有助于打破周期。基本上,不计算弱引用,因此将删除仅具有弱引用的对象。在该示例中,由于Apartment
实例仅具有对Person
实例的弱引用,因此后者的引用计数为0并将被处置。之后,Apartment
实例的引用计数也为0,也将被处理。