Middle
Quelles sont les liens dans l'objet sitetable?
sobes.tech IA
Réponse de l'IA
Fort (strong), faible (weak), sans propriétaire (unowned).
- Fort : Crée la possession de l'objet, empêchant sa déallocation tant qu'il existe des références fortes.
- Faible : Ne crée pas de possession. Si l'objet référencé par la référence faible est déallocé, la référence faible devient automatiquement nil. Utilisé pour prévenir les cycles de références fortes, souvent pour des références à l'objet parent ou au délégué.
- Sans propriétaire : Ne crée pas de possession. Semblable à la référence faible, mais garantit que l'objet référencé existera tout au long de son cycle de vie sans propriétaire. Si l'accès à l'objet est tenté après sa déallocation, une erreur d'exécution (crash) se produira. Utilisé lorsque les objets ont un cycle de vie similaire ou lié, et que nil est acceptable mais non attendu.
// Exemple de 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 // Crée un cycle de références fortes
parent = nil // Parent ne sera pas déallocé à cause de la référence forte depuis child
child = nil // Child ne sera pas déallocé à cause de la référence forte depuis parent
// Exemple de Weak
class ParentWeak {
var child: ChildWeak?
}
class ChildWeak {
weak var parent: ParentWeak? // Référence faible
deinit {
print("ChildWeak déallocé")
}
}
var parentWeak: ParentWeak? = ParentWeak()
var childWeak: ChildWeak? = ChildWeak()
parentWeak?.child = childWeak
childWeak?.parent = parentWeak
parentWeak = nil // ParentWeak déallocé
// ChildWeak déallocé
// Exemple de Unowned
class ParentUnowned {
var child: ChildUnowned?
}
class ChildUnowned {
unowned var parent: ParentUnowned // Référence sans propriété
init(parent: ParentUnowned) {
self.parent = parent
}
deinit {
print("ChildUnowned déallocé")
}
}
var parentUnowned: ParentUnowned? = ParentUnowned()
var childUnowned: ChildUnowned? = ChildUnowned(parent: parentUnowned!) // ParentUnowned doit exister
parentUnowned?.child = childUnowned
parentUnowned = nil // ParentUnowned déallocé, ChildUnowned déallocé