Swift Language Ciclos de referencia y referencias débiles


Ejemplo

Un ciclo de referencia (o ciclo de retención ) se llama así porque indica un ciclo en el gráfico de objetos :

ciclo de retención

Cada flecha indica un objeto que retiene otro (una referencia fuerte). A menos que el ciclo se rompa, la memoria de estos objetos nunca se liberará .

Se crea un ciclo de retención cuando dos instancias de clases se hacen referencia:

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

Ambas instancias vivirán hasta que el programa termine. Este es un ciclo de retención.

Referencias débiles

Para evitar los ciclos de retención, use la palabra clave weak o unowned al crear referencias para romper los ciclos de retención.

class B { weak var a: A? = nil }

Las referencias débiles o sin propiedad no aumentarán el recuento de referencias de una instancia. Estas referencias no contribuyen a retener los ciclos. La referencia débil se vuelve nil cuando el objeto al que hace referencia se desasigna.

a.b = b  // a retains b
b.a = a  // b holds a weak reference to a -- not a reference cycle

Cuando trabaje con cierres, también puede usar weak y unowned en las listas de captura .