Sobes.tech
Junior

¿Cuál es la diferencia entre enlaces débiles y fuertes?

sobes.tech AI

Respuesta de la IA

La diferencia en el mecanismo de gestión de memoria (ARC - Conteo de Referencias Automático).

  • Referencia fuerte (Strong reference): Aumenta el contador de referencias del objeto en 1. El objeto no puede ser liberado de la memoria mientras exista al menos una referencia fuerte a él. Este comportamiento es predeterminado para propiedades y variables en Swift.

  • Referencia débil (Weak reference): No aumenta el contador de referencias del objeto. Se utilizan para prevenir referencias cíclicas, cuando dos o más objetos tienen referencias fuertes entre sí, creando una fuga de memoria. Las referencias débiles siempre son opcionales (Optional), porque el objeto al que hacen referencia puede ser desasignado en cualquier momento. Si el objeto es liberado, la referencia débil automáticamente se vuelve nil.

Ejemplo de referencia cíclica y su prevención mediante referencia débil:

class Person {
    let name: String
    var apartment: Apartment? // Referencia fuerte aquí inicialmente
    init(name: String) { self.name = name }
    deinit { print("\(name) está siendo desalojado") }
}

class Apartment {
    let unit: String
    weak var tenant: Person? // Referencia débil aquí
    init(unit: String) { self.unit = unit }
    deinit { print("Apartamento \(unit) está siendo desalojado") }
}

var john: Person? // Instancia de Person
var unit4A: Apartment? // Instancia de Apartment

john = Person(name: "John Appleseed")
unit4A = Apartment(unit: "4A")

// Creando un ciclo de referencia fuerte:
// john tiene una referencia fuerte al apartamento
// el apartamento tiene una referencia fuerte a la persona
john!.apartment = unit4A
unit4A!.tenant = john // Esto debe ser débil para romper el ciclo

john = nil // Asignar a nil a john no lo desalojará si existe el ciclo
unit4A = nil // Asignar a nil a unit4A no lo desalojará si existe el ciclo

// Salida esperada al usar referencia débil para tenant:
// John Appleseed está siendo desalojado
// Apartamento 4A está siendo desalojado

Sin weak para tenant, los destructores no serían llamados, lo que indica una fuga de memoria.