Junior
Hoe werkt de garbage collector?
sobes.tech AI
Antwoord van AI
In de context van iOS/macOS-ontwikkeling gebruikt Swift/Objective-C geen garbage collector (GC), maar automatische referentietelling (Automatic Reference Counting, ARC).
ARC beheert automatisch het geheugen door het tellen van het aantal sterke referenties (Strong) naar elke klasse-voorbeeld (en closures met capture). Wanneer de teller op nul komt, vrijwaart het systeem het geheugen dat door het object wordt ingenomen.
Belangrijke punten over ARC:
- Sterke referenties (Strong): Verhogen de referentieteller. Het object blijft in het geheugen zolang er minstens één sterke referentie is.
- Zwakke referenties (Weak): Verhogen de teller niet. Worden gebruikt om cycli van sterke referenties te voorkomen. Ze verwijzen optioneel naar een object en worden nil wanneer het object wordt vrijgegeven.
- Onbezette referenties (Unowned): Verhogen de teller niet. Worden gebruikt wanneer de levenscyclus van de objecten bekend is en één object altijd zal bestaan zolang een ander bestaat. De referentie is niet optioneel. Als het object waarnaar een unowned verwijst wordt vrijgegeven, leidt toegang tot een runtime-fout.
ARC werkt tijdens de compilatie, door oproepen naar retain (verhogen van de teller) en release (verlagen van de teller) in de juiste code te plaatsen.
class MyClass {
var prop: String = ""
}
var reference1: MyClass? = MyClass() // Teller = 1
var reference2 = reference1 // Teller = 2
reference1 = nil // Teller = 1
reference2 = nil // Teller = 0, object wordt vrijgegeven
class Person {
let name: String
weak var apartment: Apartment? // Zwakke verwijzing om cycli te voorkomen
init(name: String) { self.name = name; print("\(name) wordt geïnitialiseerd") }
deinit { print("\(name) wordt gedeinitialiseerd") }
}
class Apartment {
let unit: String
unowned var tenant: Person // Onbezette verwijzing
init(unit: String, tenant: Person) { self.unit = unit; self.tenant = tenant; print("Appartement \(unit) wordt geïnitialiseerd") }
deinit { print("Appartement \(unit) wordt gedeinitialiseerd") }
}