Swift Language Cicli di riferimento e riferimenti deboli


Esempio

Un ciclo di riferimento (o ciclo di mantenimento ) è così chiamato perché indica un ciclo nel grafico dell'oggetto :

mantenere il ciclo

Ogni freccia indica un oggetto che ne conserva un altro (un riferimento forte). A meno che il ciclo non venga interrotto, la memoria di questi oggetti non verrà mai liberata .

Un ciclo di conservazione viene creato quando due istanze di classi si richiamano l'una con l'altra:

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

Entrambe le istanze vivranno fino alla fine del programma. Questo è un ciclo di conservazione.

Riferimenti deboli

Per evitare i cicli di conservazione, utilizzare la parola chiave weak o unowned durante la creazione di riferimenti per interrompere i cicli di conservazione.

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

I riferimenti deboli o non condivisi non aumentano il numero di riferimenti di un'istanza. Questi riferimenti non contribuiscono a mantenere i cicli. Il riferimento debole diventa nil quando l'oggetto a cui fa riferimento viene deallocato.

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

Quando si lavora con chiusure, è possibile utilizzare anche gli elenchi di acquisizione weak e unowned .