簡體   English   中英

為什么Swift不會自動處理循環引用(強引用循環)

[英]Why Swift does not dispose circular references (strong reference cycles) automatically

對不起,如果這是一個愚蠢的問題。 我剛開始學習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引用了number73number73引用了john 因此,如果刪除了weak關鍵字,則每個對象至少有一個對象的引用,因此不會處理任何對象。

弱引用有助於打破周期。 基本上,不計算弱引用,因此將刪除僅具有弱引用的對象。 在該示例中,由於Apartment實例僅具有對Person實例的弱引用,因此后者的引用計數為0並將被處置。 之后, Apartment實例的引用計數也為0,也將被處置。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM