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