參考週期和弱參考
一個參考週期 (或保留週期 )被如此命名是因為它表明一個週期中的物件圖 :
每個箭頭表示一個物件保留另一個(強引用)。除非迴圈被破壞,否則永遠不會釋放這些物件的記憶體。
當兩個類例項相互引用時,會建立一個保留週期:
class A { var b: B? = nil }
class B { var a: A? = nil }
let a = A()
let b = B()
a.b = b // a retains b
b.a = a // b retains a -- a reference cycle
這兩個例項都將繼續存在,直到程式終止。這是一個保留週期。
弱參考
要避免保留週期,請在建立中斷保留週期的引用時使用關鍵字 weak
或 unowned
。
class B { weak var a: A? = nil }
弱或無主引用不會增加例項的引用計數。這些參考文獻無助於保留週期。當引用的物件被釋放時,弱引用變為 nil
。
a.b = b // a retains b
b.a = a // b holds a weak reference to a -- not a reference cycle
使用閉包時,你還可以在捕獲列表中使用 weak
和 unowned
。