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