Intern
¿Qué es un recolector de basura (garbage collector)?
sobes.tech AI
Respuesta de la IA
En iOS no hay un recolector de basura tradicional. En su lugar, se utiliza el mecanismo de Referencia Automática (ARC).
- Mecanismo automático: ARC cuenta automáticamente las referencias fuertes a los objetos.
- Liberación de memoria: Cuando el conteo de referencias fuertes a un objeto llega a cero, ARC libera la memoria asignada.
- Prevención de fugas: El uso correcto de referencias fuertes, débiles y no poseídas (unowned) permite prevenir fugas de memoria y ciclos de referencias fuertes.
Tipos de referencias en ARC:
- Fuerte (strong): Incrementa el contador de referencias. Es el valor predeterminado.
- Débil (weak): No incrementa el contador de referencias. Se vuelve automáticamente
nilal desasignar el objeto. Se usa para prevenir ciclos de referencias fuertes. Se declara como un tipo opcional. - No poseída (unowned): No incrementa el contador de referencias. Se garantiza que el objeto al que se refiere existe durante toda la vida útil de la referencia no poseída. No es opcional. Se usa cuando dos objetos tienen una relación fuerte mutua, pero uno de ellos tiene un ciclo de vida más corto.
Ventajas de ARC:
- Previsibilidad: La liberación de memoria ocurre de manera determinista, tan pronto como el objeto ya no se usa.
- Rendimiento: No hay costos adicionales por un recolector de basura en segundo plano, que puede causar pausas.
- Simplicidad: El desarrollador no necesita gestionar manualmente la memoria en la mayoría de los casos, pero debe entender los principios de conteo de referencias para prevenir fugas.
Ejemplo de ciclo de referencias fuertes:
class Person {
let name: String
var apartment: Apartment? // referencia fuerte a Apartment
init(name: String) { self.name = name }
deinit { print("\(name) está siendo desalojado") }
}
class Apartment {
let unit: String
weak var tenant: Person? // referencia débil a Person para prevenir ciclo
init(unit: String) { self.unit = unit }
deinit { print("Apartamento \(unit) está siendo desalojado") }
}
var john: Person?
var unit4A: Apartment?
john = Person(name: "John Appleseed")
unit4A = Apartment(unit: "4A")
john!.apartment = unit4A
unit4A!.tenant = john // El uso de weak aquí es crítico
john = nil
unit4A = nil
// Sin tenant weak: Tanto john como unit4A no serían desalojados.
// Con tenant weak: Tanto john como unit4A son desalojados correctamente.