参考周期和弱参考

一个参考周期 (或保留周期 )被如此命名是因为它表明一个周期中的对象图

保留周期

每个箭头表示一个对象保留另一个(强引用)。除非循环被破坏,否则永远不会释放这些对象的内存。

当两个类实例相互引用时,会创建一个保留周期:

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