Junior — Middle
¿En qué se diferencian los enlaces de tipo Weak y Unowned en la gestión de memoria?
sobes.tech AI
Respuesta de la IA
En Swift, las referencias de tipo weak y unowned se utilizan para prevenir ciclos de referencias fuertes (ciclos de retención) en la gestión de memoria, pero difieren en comportamiento y uso.
-
Weak (referencia débil):
- Puede ser
nil. - Se declara como un tipo opcional (
var delegate: SomeDelegate? weak). - Se usa cuando la referencia puede volverse
nildurante la vida del objeto, por ejemplo, los delegados. - El sistema automáticamente pone a
nilla referenciaweakcuando el objeto al que apunta se libera.
- Puede ser
-
Unowned (sin dueño):
- No puede ser
nil(tipo no opcional). - Se usa cuando la referencia existe garantizadamente durante la vida del objeto, por ejemplo, entre un padre y un hijo.
- Si el objeto al que se refiere
unownedya ha sido liberado, un intento de acceso causará un error en tiempo de ejecución (crash).
- No puede ser
Ejemplo:
class Person {
var apartment: Apartment?
}
class Apartment {
unowned let tenant: Person
init(tenant: Person) {
self.tenant = tenant
}
}
// Aquí, tenant es un `unowned`, ya que un apartamento no puede existir sin un inquilino.
class DelegateHolder {
weak var delegate: SomeDelegate?
}
// El delegado es `weak`, ya que puede ser liberado antes.
Por lo tanto, weak es adecuado para referencias que pueden volverse nil, y unowned para referencias que siempre deben ser válidas durante la vida del objeto.