Middle
Quali collegamenti ci sono nell'oggetto sitetable?
sobes.tech AI
Risposta dell'AI
Forti (strong), deboli (weak), senza proprietà (unowned).
- Forti: Crea il possesso dell'oggetto, impedendo la sua deallocazione finché ci sono riferimenti forti.
- Deboli: Non crea possesso. Se l'oggetto a cui si riferisce il riferimento debole viene deallocato, il riferimento debole diventa automaticamente nil. Usato per prevenire cicli di riferimenti forti, spesso per riferimenti all'oggetto genitore o delegato.
- Senza proprietà: Non crea possesso. Simile al riferimento debole, ma garantisce che l'oggetto a cui si riferisce esisterà durante tutto il ciclo di vita senza possesso. Se si tenta di accedere all'oggetto dopo la sua deallocazione, si verificherà un errore di runtime (crash). Usato quando gli oggetti hanno un ciclo di vita simile o collegato, e nil è accettabile ma non previsto.
// Esempio di Strong
class Parent {
var child: Child?
}
class Child {
var parent: Parent?
}
var parent: Parent? = Parent()
var child: Child? = Child()
parent?.child = child
child?.parent = parent // Crea un ciclo di riferimenti forti
parent = nil // Parent non sarà deallocato a causa del riferimento forte da parte di child
child = nil // Child non sarà deallocato a causa del riferimento forte da parte di parent
// Esempio di Weak
class ParentWeak {
var child: ChildWeak?
}
class ChildWeak {
weak var parent: ParentWeak? // Riferimento debole
deinit {
print("ChildWeak deallocato")
}
}
var parentWeak: ParentWeak? = ParentWeak()
var childWeak: ChildWeak? = ChildWeak()
parentWeak?.child = childWeak
childWeak?.parent = parentWeak
parentWeak = nil // ParentWeak deallocato
// ChildWeak deallocato
// Esempio di Unowned
class ParentUnowned {
var child: ChildUnowned?
}
class ChildUnowned {
unowned var parent: ParentUnowned // Riferimento senza proprietà
init(parent: ParentUnowned) {
self.parent = parent
}
deinit {
print("ChildUnowned deallocato")
}
}
var parentUnowned: ParentUnowned? = ParentUnowned()
var childUnowned: ChildUnowned? = ChildUnowned(parent: parentUnowned!) // ParentUnowned deve esistere
parentUnowned?.child = childUnowned
parentUnowned = nil // ParentUnowned deallocato, ChildUnowned deallocato