¿Qué es el conteo automático de enlaces?
sobes.tech AI
Respuesta de la IA
El conteo automático de referencias (Automatic Reference Counting, ARC) es un mecanismo de gestión de memoria en Swift y Objective-C que rastrea y libera automáticamente la memoria asignada a los objetos. Cada instancia de clase tiene un contador de referencias que aumenta al crear una referencia fuerte al objeto y disminuye al eliminarla. Cuando el contador de referencias llega a cero, ARC desasigna automáticamente el objeto y libera la memoria que ocupa.
ARC previene fugas de memoria y liberaciones dobles, simplificando la gestión de memoria en comparación con la gestión manual (como en Objective-C sin ARC).
Existen tres tipos de referencias:
- Strong (Fuerte): Incrementa el contador de referencias del objeto. Es el tipo de referencia predeterminado.
- Weak (Débil): No incrementa el contador de referencias. Se usa para prevenir ciclos de referencias fuertes, cuando dos objetos se refieren entre sí. La referencia débil se vuelve
nilsi el objeto al que apunta es desasignado. Se define con la palabra claveweak. - Unowned (Sin dueño): No incrementa el contador de referencias y siempre tiene un valor. Se usa cuando se sabe que la referencia siempre apuntará a un objeto mientras exista. A diferencia de
weak, la referencia sin dueño no se vuelvenily puede causar un fallo si se intenta acceder al objeto después de su desasignación. Se define con la palabra claveunowned.
Ejemplo de ciclo de referencias fuertes:
class Human {
let name: String
var apartment: Apartment? // Referencia fuerte a un Apartment opcional
init(name: String) {
self.name = name
print("\(name) está siendo inicializado")
}
deinit {
print("\(name) está siendo desinicializado")
}
}
class Apartment {
let unit: String
var tenant: Human? // Referencia fuerte a un Human opcional
init(unit: String) {
self.unit = unit
print("Apartamento \(unit) está siendo inicializado")
}
deinit {
print("Apartamento \(unit) está siendo desinicializado")
}
}
var john: Human?
var unit4A: Apartment?
john = Human(name: "John Appleseed")
unit4A = Apartment(unit: "4A")
john!.apartment = unit4A
unit4A!.tenant = john
john = nil
unit4A = nil
// No se mostrará ni "John Appleseed está siendo desinicializado" ni "Apartamento 4A está siendo desinicializado" debido al ciclo de referencias fuertes
Solución al ciclo de referencias fuertes usando weak:
class Human {
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: Human? // Referencia débil
init(unit: String) {
self.unit = unit
print("Apartamento \(unit) está siendo inicializado")
}
deinit {
print("Apartamento \(unit) está siendo desinicializado")
}
}
var john: Human?
var unit4A: Apartment?
john = Human(name: "John Appleseed")
unit4A = Apartment(unit: "4A")
john!.apartment = unit4A
unit4A!.tenant = john
john = nil // John es desasignado, ya que su contador de referencias llega a 0
unit4A = nil // Apartment es desasignado, ya que su contador de referencias llega a 0