Sobes.tech
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 nil durante la vida del objeto, por ejemplo, los delegados.
    • El sistema automáticamente pone a nil la referencia weak cuando el objeto al que apunta se libera.
  • 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 unowned ya ha sido liberado, un intento de acceso causará un error en tiempo de ejecución (crash).

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.