參考週期和弱參考

一個參考週期 (或保留週期 )被如此命名是因為它表明一個週期中的物件圖

保留週期

每個箭頭表示一個物件保留另一個(強引用)。除非迴圈被破壞,否則永遠不會釋放這些物件的記憶體。

當兩個類例項相互引用時,會建立一個保留週期:

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

這兩個例項都將繼續存在,直到程式終止。這是一個保留週期。

弱參考

要避免保留週期,請在建立中斷保留週期的引用時使用關鍵字 weakunowned

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

使用閉包時,你還可以在捕獲列表中使用 weakunowned