Sobes.tech
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