Sobes.tech
Junior

¿Qué es el modificador de memoria weak en Swift?

sobes.tech AI

Respuesta de la IA

El modificador weak se utiliza para romper ciclos de referencias fuertes entre objetos, cuando un objeto tiene una referencia fuerte a otro, y este a su vez tiene una referencia fuerte de vuelta.

Características principales de weak:

  • No aumenta el contador de referencias: El uso de weak no incrementa el número de referencias fuertes al objeto.
  • Puede ser nil: La referencia débil es opcional (Optional) y se vuelve automáticamente nil cuando el objeto al que hace referencia se desinicializa.
  • Se usa para padre/hijo: Se aplica a menudo cuando un objeto hijo tiene una referencia a su padre para evitar ciclos de referencias fuertes.
  • Requiere ser declarado como var: Dado que la referencia débil puede volverse nil, debe ser una variable (var), no una constante (let).

Ejemplo de uso:

class Person {
    let name: String
    var apartment: Apartment?

    init(name: String) {
        self.name = name
        print("\(name) está siendo inicializado")
    }

    deinit {
        print("\(name) está siendo desinicializado")
    }
}

class Apartment {
    let unit: String
    weak var tenant: Person? // Referencia débil

    init(unit: String) {
        self.unit = unit
        print("Apartamento \(unit) está siendo inicializado")
    }

    deinit {
        print("Apartamento \(unit) está siendo desinicializado")
    }
}

Sin weak var tenant: Person? en la clase Apartment, se produciría un ciclo de referencias fuertes, y las instancias de Person y Apartment no serían desinicializadas cuando ya no tengan otras referencias fuertes. Gracias a weak, cuando la instancia de Person se desinicializa, la referencia tenant en la instancia de Apartment se vuelve automáticamente nil.