Middle
¿Qué enlaces hay en el objeto sitetable?
sobes.tech AI
Respuesta de la IA
Fuertes (strong), débiles (weak), sin propietario (unowned).
- Fuerte: Crea la posesión del objeto, evitando su deallocación mientras existan referencias fuertes.
- Débil: No crea posesión. Si el objeto al que hace referencia la referencia débil se dealloca, la referencia débil se vuelve automáticamente nil. Se usa para prevenir ciclos de referencias fuertes, a menudo para referencias a objetos padre o delegados.
- Sin propietario: No crea posesión. Similar a la referencia débil, pero garantiza que el objeto al que hace referencia existirá durante todo su ciclo de vida sin propietario. Si se intenta acceder al objeto después de su deallocación, se producirá un error en tiempo de ejecución (crash). Se usa cuando los objetos tienen un ciclo de vida similar o relacionado, y nil es aceptable pero no esperado.
// Ejemplo 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 // Crea un ciclo de referencias fuertes
parent = nil // Parent no será deallocado debido a la referencia fuerte desde child
child = nil // Child no será deallocado debido a la referencia fuerte desde parent
// Ejemplo de Weak
class ParentWeak {
var child: ChildWeak?
}
class ChildWeak {
weak var parent: ParentWeak? // Referencia débil
deinit {
print("ChildWeak eliminado")
}
}
var parentWeak: ParentWeak? = ParentWeak()
var childWeak: ChildWeak? = ChildWeak()
parentWeak?.child = childWeak
childWeak?.parent = parentWeak
parentWeak = nil // ParentWeak eliminado
// ChildWeak eliminado
// Ejemplo de Unowned
class ParentUnowned {
var child: ChildUnowned?
}
class ChildUnowned {
unowned var parent: ParentUnowned // Referencia sin propietario
init(parent: ParentUnowned) {
self.parent = parent
}
deinit {
print("ChildUnowned eliminado")
}
}
var parentUnowned: ParentUnowned? = ParentUnowned()
var childUnowned: ChildUnowned? = ChildUnowned(parent: parentUnowned!) // ParentUnowned debe existir
parentUnowned?.child = childUnowned
parentUnowned = nil // ParentUnowned eliminado, ChildUnowned eliminado