Junior
Ako funguje zberač odpadu (garbage collector)?
sobes.tech AI
Odpoveď od AI
V kontexte vývoja iOS/macOS Swift/Objective-C nepoužíva garbage collector (GC), ale automatické počítanie odkazov (Automatic Reference Counting, ARC).
ARC automaticky spravuje pamäť tým, že počíta počet silných odkazov (Strong) na každú inštanciu triedy (a uzávierky s zachytením). Keď čítač silných odkazov dosiahne nulu, systém uvoľní pamäť obsadenú objektom.
Hlavné body ARC:
- Silné odkazy (Strong): Zvyšujú čítač odkazov. Objekt zostáva v pamäti, kým má aspoň jeden silný odkaz.
- Slabé odkazy (Weak): Nezvyšujú čítač odkazov. Používajú sa na prevenciu cyklov silných odkazov. Odkazujú voliteľne na objekt a stanú sa nil, keď je objekt uvoľnený.
- Nezávislé odkazy (Unowned): Nezvyšujú čítač odkazov. Používajú sa, keď je známy životný cyklus objektov a jeden objekt bude vždy existovať, kým existuje iný. Odkaz nie je voliteľný. Ak je objekt, na ktorý sa odkazuje unowned, uvoľnený, prístup k nemu spôsobí runtime chybu.
ARC pracuje počas fázy kompilácie, vkladá volania retain (zvýšenie čítača) a release (zníženie čítača) do príslušného kódu.
class MyClass {
var prop: String = ""
}
var reference1: MyClass? = MyClass() // Čítač = 1
var reference2 = reference1 // Čítač = 2
reference1 = nil // Čítač = 1
reference2 = nil // Čítač = 0, objekt je uvoľnený
class Person {
let name: String
weak var apartment: Apartment? // Slabý odkaz na zabránenie cyklu
init(name: String) { self.name = name; print("\(name) sa inicializuje") }
deinit { print("\(name) sa deinitializuje") }
}
class Apartment {
let unit: String
unowned var tenant: Person // Nezabývajúci odkaz
init(unit: String, tenant: Person) { self.unit = unit; self.tenant = tenant; print("Byt \(unit) sa inicializuje") }
deinit { print("Byt \(unit) sa deinitializuje") }
}