2014-10-31 72 views
7

如果這是一個愚蠢的問題,很抱歉。我剛開始學習迅速。我主要在日常工作中使用php。蘋果商店的SWIFT教科書使用下面的例子(我修改成一個較短的版本)來證明的弱引用的使用:爲什麼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 

在上面的公寓類的定義,如果關鍵字被刪除從var租戶,它會在下面的代碼中創建一個強引用週期,以便兩個實例不會被GC處置。但是,在我看來,GC確實不需要弱參考指標。很顯然,這兩個實例不能從當前範圍中的任何變量或任何靜態變量鏈接,因此它們可以安全地處理。

爲什麼要用Swift強制語法?我能弄清楚的唯一好處是弱關鍵字突出了邏輯,因此代碼更易於閱讀。

回答

13

Swift不使用標記和清掃垃圾收集。它使用引用計數。在引用計數中,計算每個對象有多少個引用:每次創建一個對象的新引用時,引用計數都會增加,並且每次刪除對象的引用時,引用計數都會遞減。只要一個對象具有零引用,它就會被丟棄。參考計數的一個主要弱點是循環結構化不被處置。

在您的示例中,johnnumber73有參考,number73john有參考。所以,如果weak關鍵字被刪除,每個對象至少有一個引用,所以沒有任何對象將被丟棄。

弱引用有助於打破週期。基本上,弱引用不計算在內,因此只有弱引用的對象纔會被刪除。在該示例中,由於Apartment實例僅對Person實例有一個弱引用,後者的引用計數爲0並將被丟棄。之後,Apartment實例的引用計數也爲0,並且也將被丟棄。

+0

「Swift不使用標記和清除垃圾回收,它使用引用計數」給出瞭解釋。 – 2017-03-06 08:48:21