Middle
¿En qué consiste la diferencia entre el recolector de basura (garbage collector) y la gestión automática de memoria (ARC)?
sobes.tech AI
Respuesta de la IA
El recolector de basura encuentra y libera automáticamente la memoria que ya no es utilizada por el programa. Funciona en segundo plano, escaneando periódicamente el montón e identificando objetos a los que no hay referencias activas.
ARC (Contado Automático de Referencias) en Swift y Objective-C gestiona la vida de los objetos contando el número de referencias fuertes a cada uno. Tan pronto como el conteo de referencias fuertes de un objeto llega a cero, ARC libera automáticamente la memoria ocupada por ese objeto.
Diferencias principales:
| Característica | Recolector de basura | ARC |
|---|---|---|
| Principio de funcionamiento | Búsqueda de objetos inalcanzables | Conteo de referencias fuertes |
| Momento de liberación | No determinista, durante el escaneo | Determinista, cuando el conteo llega a 0 |
| Costos adicionales | Pausas en la ejecución del programa (durante la recolección) | Mínimos, al cambiar el contador |
| Previsibilidad | Baja | Alta |
| Referencias cíclicas | Requieren enfoques especiales (por ejemplo, referencias débiles) | Requieren el uso de referencias weak o unowned |
| Uso en iOS | No presente en Objective-C y Swift modernos | Mecanismo principal de gestión de memoria en Objective-C y Swift |
Ejemplo de uso de weak para prevenir ciclos de referencias fuertes en ARC:
class Person {
let name: String
var apartment: Apartment? // referencia fuerte
init(name: String) {
self.name = name
print("\(name) está siendo inicializado")
}
deinit {
print("\(name) está siendo destruido")
}
}
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 destruido")
}
}
var john: Person?
var unit4A: Apartment?
john = Person(name: "John Appleseed")
unit4A = Apartment(unit: "4A")
john!.apartment = unit4A
unit4A!.tenant = john // referencia débil previene ciclo de retención
john = nil // Objeto Person es destruido
unit4A = nil // Objeto Apartment es destruido