Sobes.tech
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