参考周期和弱参考
一个参考周期 (或保留周期 )被如此命名是因为它表明一个周期中的对象图 :
每个箭头表示一个对象保留另一个(强引用)。除非循环被破坏,否则永远不会释放这些对象的内存。
当两个类实例相互引用时,会创建一个保留周期:
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
。