![](/img/trans.png)
[英]Does ARC guarantee that an object is dealloc'ed instantly once the last strong reference is gone?
[英]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
引用了number73
, number73
引用了john
。 因此,如果刪除了weak
關鍵字,則每個對象至少有一個對象的引用,因此不會處理任何對象。
弱引用有助於打破周期。 基本上,不計算弱引用,因此將刪除僅具有弱引用的對象。 在該示例中,由於Apartment
實例僅具有對Person
實例的弱引用,因此后者的引用計數為0並將被處置。 之后, Apartment
實例的引用計數也為0,也將被處置。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.