Middle
Wat is het verschil tussen de garbage collector en automatisch geheugenbeheer (ARC)?
sobes.tech AI
Antwoord van AI
De garbage collector vindt en vrijmaakt automatisch het geheugen dat niet meer door het programma wordt gebruikt. Het werkt op de achtergrond, scant periodiek de heap en identificeert objecten waar geen actieve verwijzingen meer naar zijn.
ARC (Automatische Referentie Telling) in Swift en Objective-C beheert de levensduur van objecten door het aantal sterke verwijzingen naar elk object te tellen. Zodra het aantal sterke verwijzingen naar een object nul wordt, vrijwaart ARC automatisch het geheugen dat door dat object wordt ingenomen.
Belangrijkste verschillen:
| Kenmerk | Garbage collector | ARC |
|---|---|---|
| Werkingsprincipe | Zoeken naar onbereikbare objecten | Tellen van sterke verwijzingen |
| Moment van vrijgave | Niet-deterministisch, tijdens scan | Deterministisch, bij 0 verwijzingen |
| Extra kosten | Pauzes in de uitvoering van het programma (tijdens de verzameling) | Minimaal, bij wijziging teller |
| Voorspelbaarheid | Laag | Hoog |
| Cyclusverwijzingen | Vereisen speciale aanpak (bijvoorbeeld zwakke verwijzingen) | Vereisen gebruik van weak of unowned verwijzingen |
| Gebruik in iOS | Afwezig in moderne Objective-C en Swift | Hoofdmechanisme voor geheugenbeheer in Objective-C en Swift |
Voorbeeld van gebruik van weak om cycli van sterke verwijzingen in ARC te voorkomen:
class Person {
let name: String
var apartment: Apartment? // sterke verwijzing
init(name: String) {
self.name = name
print("\(name) wordt geïnitialiseerd")
}
deinit {
print("\(name) wordt gedeinitialiseerd")
}
}
class Apartment {
let unit: String
weak var tenant: Person? // zwakke verwijzing
init(unit: String) {
self.unit = unit
print("Appartement \(unit) wordt geïnitialiseerd")
}
deinit {
print("Appartement \(unit) wordt gedeinitialiseerd")
}
}
var john: Person?
var unit4A: Apartment?
john = Person(name: "John Appleseed")
unit4A = Apartment(unit: "4A")
john!.apartment = unit4A
unit4A!.tenant = john // zwakke verwijzing voorkomt referentiecyclus
john = nil // Person-object wordt gedeinitialiseerd
unit4A = nil // Apartment-object wordt gedeinitialiseerd