¿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 vuelvenil.
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.