【问题标题】:Why Swift does not dispose circular references (strong reference cycles) automatically为什么 Swift 不会自动处理循环引用(强引用循环)
【发布时间】:2014-12-27 23:34:08
【问题描述】:

抱歉,这是一个愚蠢的问题。我刚开始学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

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

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

【问题讨论】:

    标签: macos swift garbage-collection circular-reference


    【解决方案1】:

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

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

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

    【讨论】:

    • “Swift 不使用标记和清除垃圾收集。它使用引用计数”给出了解释。
    猜你喜欢
    • 1970-01-01
    • 2016-09-04
    • 2015-11-08
    • 1970-01-01
    • 2011-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多