Sobes.tech
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") }
}