Swift中的循環(huán)強(qiáng)引用--【使用弱引用解決】

弱引用(weak)

聲明屬性或者變量時(shí),在前面加上weak關(guān)鍵字表明這是一個(gè)弱引用,弱引用會(huì)被定義為可選類型變量,而不是常量,因?yàn)槎x的類型可以被賦值為nil。

案例

class Person {
    let name: String
    init(name: String) { self.name = name }
    var apartment: Apartment?
    deinit { print("\(name) is being deinitialized") }
}

class Apartment {
    let unit: String
    init(unit: String) { self.unit = unit }
    weak var tenant: Person?
    deinit { print("Apartment \(unit) is being deinitialized") }
}

建立兩個(gè)變量(john和unit4A)之間的強(qiáng)引用,并關(guān)聯(lián)兩個(gè)實(shí)例:

var john: Person?
var unit4A: Apartment?

john = Person(name: "John Appleseed")
unit4A = Apartment(unit: "4A")

john!.apartment = unit4A
unit4A!.tenant = john

兩個(gè)關(guān)聯(lián)在一起的實(shí)例的引用關(guān)系如下圖所示:


Person 實(shí)例依然保持對(duì)Apartment實(shí)例的強(qiáng)引用,但是Apartment實(shí)例只持有對(duì)Person實(shí)例的弱引用。這意味著當(dāng)你斷開john變量所保持的強(qiáng)引用時(shí),再也沒有指向Person實(shí)例的強(qiáng)引用了:

由于再也沒有指向Person實(shí)例的強(qiáng)引用,該實(shí)例會(huì)被銷毀:

john = nil
// 打印 “John Appleseed is being deinitialized”

唯一剩下的指向Apartment實(shí)例的強(qiáng)引用來(lái)自于變量unit4A。如果你斷開這個(gè)強(qiáng)引用,再也沒有指向Apartment實(shí)例的強(qiáng)引用了:


由于再也沒有指向Apartment實(shí)例的強(qiáng)引用,該實(shí)例也會(huì)被銷毀:

unit4A = nil
// 打印 “Apartment 4A is being deinitialized”

上面的兩段代碼展示了變量johnunit4A在被賦值為nil后,Person實(shí)例和Apartment實(shí)例的析構(gòu)函數(shù)都打印出“銷毀”的信息。這證明了引用循環(huán)被打破了。

注意
在使用垃圾收集的系統(tǒng)里,弱指針有時(shí)用來(lái)實(shí)現(xiàn)簡(jiǎn)單的緩沖機(jī)制,因?yàn)闆]有強(qiáng)引用的對(duì)象只會(huì)在內(nèi)存壓力觸發(fā)垃圾收集時(shí)才被銷毀。但是在 ARC 中,一旦值的最后一個(gè)強(qiáng)引用被移除,就會(huì)被立即銷毀,這導(dǎo)致弱引用并不適合上面的用途。

引自:http://www.piggybear.net/?p=675

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容