Sobes.tech
Middle

Care este diferența dintre colectorul de gunoi (garbage collector) și gestionarea automată a memoriei (ARC)?

sobes.tech AI

Răspuns de la AI

Colectorul de gunoi găsește și eliberează automat memoria care nu mai este utilizată de program. Funcționează în fundal, scanând periodic heap-ul și identificând obiectele la care nu mai există referințe active.

ARC (Contorizarea Automată a Referințelor) în Swift și Objective-C gestionează durata de viață a obiectelor numărând numărul de referințe puternice către fiecare obiect. Când numărul de referințe puternice către un obiect ajunge la zero, ARC eliberează automat memoria ocupată de acel obiect.

Principalele diferențe:

Caracteristică Colector de gunoi ARC
Principiu de funcționare Căutarea obiectelor inaccesibile Contorizarea referințelor puternice
Momentul eliberării Nondeterminist, în timpul scanării Determinist, când contorul ajunge la 0
Costuri suplimentare Pauze în execuția programului (în timpul colectării) Minime, la modificarea contorului
Prevedere Scăzută Ridicată
Referințe ciclice Necesită abordări speciale (de exemplu, referințe slabe) Necesită utilizarea referințelor weak sau unowned
Utilizare în iOS Absent în Objective-C și Swift moderne Principalul mecanism de gestionare a memoriei în Objective-C și Swift

Exemplu de utilizare a weak pentru prevenirea ciclurilor de referințe puternice în ARC:

class Person {
    let name: String
    var apartment: Apartment? // referință puternică

    init(name: String) {
        self.name = name
        print("\(name) este inițializat")
    }
    deinit {
        print("\(name) este dezinitalizat")
    }
}

class Apartment {
    let unit: String
    weak var tenant: Person? // referință slabă

    init(unit: String) {
        self.unit = unit
        print("Apartament \(unit) este inițializat")
    }
    deinit {
        print("Apartament \(unit) este dezinitalizat")
    }
}

var john: Person?
var unit4A: Apartment?

john = Person(name: "John Appleseed")
unit4A = Apartment(unit: "4A")

john!.apartment = unit4A
unit4A!.tenant = john // referință slabă previne ciclul de retenție

john = nil // Obiectul Person este dezinitalizat
unit4A = nil // Obiectul Apartment este dezinitalizat