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