Sobes.tech
Middle

Was ist der Unterschied zwischen dem Garbage Collector und der automatischen Speicherverwaltung (ARC)?

sobes.tech KI

Antwort von AI

Der Müllsammler findet und gibt automatisch den Speicher frei, der vom Programm nicht mehr verwendet wird. Er arbeitet im Hintergrund, scannt periodisch den Heap und identifiziert Objekte, auf die keine aktiven Referenzen mehr bestehen.

ARC (Automatisches Referenzzählung) in Swift und Objective-C verwaltet die Lebensdauer von Objekten, indem es die Anzahl der starken Referenzen auf jedes Objekt zählt. Sobald die Anzahl der starken Referenzen auf null sinkt, gibt ARC automatisch den von diesem Objekt belegten Speicher frei.

Hauptunterschiede:

Merkmal Müllsammler ARC
Funktionsprinzip Suche nach unerreichbaren Objekten Zählen starker Referenzen
Zeitpunkt der Freigabe Nicht deterministisch, beim Scannen Deterministisch, bei 0 Referenzen
Zusätzliche Kosten Pausen bei der Programmausführung (während der Sammlung) Gering, bei Zähleränderung
Vorhersagbarkeit Gering Hoch
Zyklische Referenzen Erfordern spezielle Ansätze (z.B. schwache Referenzen) Erfordern die Verwendung von weak oder unowned Referenzen
Verwendung in iOS Nicht vorhanden in modernen Objective-C und Swift Hauptmechanismus der Speicherverwaltung in Objective-C und Swift

Beispiel für die Verwendung von weak, um Zyklen starker Referenzen in ARC zu verhindern:

class Person {
    let name: String
    var apartment: Apartment? // starke Referenz

    init(name: String) {
        self.name = name
        print("\(name) wird initialisiert")
    }
    deinit {
        print("\(name) wird deinitialisiert")
    }
}

class Apartment {
    let unit: String
    weak var tenant: Person? // schwache Referenz

    init(unit: String) {
        self.unit = unit
        print("Apartment \(unit) wird initialisiert")
    }
    deinit {
        print("Apartment \(unit) wird deinitialisiert")
    }
}

var john: Person?
var unit4A: Apartment?

john = Person(name: "John Appleseed")
unit4A = Apartment(unit: "4A")

john!.apartment = unit4A
unit4A!.tenant = john // schwache Referenz verhindert Referenzzyklus

john = nil // Person-Objekt wird deinitialisiert
unit4A = nil // Apartment-Objekt wird deinitialisiert