加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-14 05:27:03 所属栏目:百科 来源:网络整理
导读:对不起,如果这是一个愚蠢的问题.我刚开始学习 swift.我主要使用php来完成日常工作. Apple Store的 Swift教科书使用以下示例(我将其修改为较短版本)来演示弱引用的用法: class Person { var apartment: Apartment?;}class Apartment { weak var tenant: Pers
对不起,如果这是一个愚蠢的问题.我刚开始学习 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中删除弱关键字,则会在以下代码中创建一个强引用循环,以便GC不会处理这两个实例.但是,在我看来,GC确实不需要弱参考的指示.很明显,这两个实例不能与当前作用域中的任何变量或任何静态变量链接,因此可以安全地处理它们.

为什么剂量Swift强制语法?我能弄清楚的唯一优势是弱关键词强调逻辑,因此代码更容易阅读.

Swift不使用标记和清除垃圾收集.它使用引用计数.在引用计数中,计算每个对象有多少引用:每次创建对象的新引用时,引用计数递增,并且每次删除对对象的引用时,引用计数递减.一旦对象具有零引用,它就被处理掉.引用计数的一个主要缺点是不处理循环结构.

在您的示例中,john引用了number73,number73引用了john.因此,如果删除了弱关键字,则每个对象至少有一个对象的引用,因此不会处理任何对象.

弱参考有助于打破周期.基本上,不计算弱引用,因此将删除仅具有弱引用的对象.在该示例中,由于Apartment实例仅具有对Person实例的弱引用,因此后者的引用计数为0并将被处置.之后,Apartment实例的引用计数也为0,也将被处置.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读