Sobes.tech
Intern

Čo je to garbage collector?

sobes.tech AI

Odpoveď od AI

V iOS nie je tradičný zberač odpadu. Namiesto neho sa používa mechanizmus Automatic Reference Counting (ARC).

  • Automatický mechanizmus: ARC automaticky počíta silné odkazy na objekty.
  • Uvoľnenie pamäti: Keď počet silných odkazov na objekt dosiahne nulu, ARC uvoľní pridelenú pamäť.
  • Prevencia únikov: Správne používanie silných, slabých a bezstarostných (unowned) odkazov umožňuje zabrániť únikom pamäti a cyklom silných odkazov.

Typy odkazov v ARC:

  • Silný (strong): Zvyšuje čítač odkazov. Predvolené.
  • Slabý (weak): Nezvyšuje čítač odkazov. Automaticky sa stáva nil pri deallokácii objektu. Používa sa na zabránenie cyklov silných odkazov. Vyhlasuje sa ako voliteľný typ.
  • Bezstarostný (unowned): Nezvyšuje čítač odkazov. Je zaručené, že objekt, na ktorý odkazuje, existuje počas celého životného cyklu bezstarostného odkazu. Nie je voliteľný. Používa sa, keď majú dva objekty vzájomnú silnú väzbu, ale jeden z nich má kratší životný cyklus.

Výhody ARC:

  • Predvídateľnosť: Uvoľnenie pamäti prebieha deterministicky, akonáhle sa objekt už nepoužíva.
  • Výkon: Neexistujú žiadne režijné náklady na pozadie zberača odpadu, ktorý by mohol spôsobovať zadrhnutia.
  • Jednoduchosť: Vývojár nemusí manuálne spravovať pamäť vo väčšine prípadov, ale musí rozumieť princípom počítania odkazov, aby predišiel únikom.

Príklad cyklu silných odkazov:

class Person {
    let name: String
    var apartment: Apartment? // silný odkaz na Apartment

    init(name: String) { self.name = name }
    deinit { print("\(name) sa deštruuje") }
}

class Apartment {
    let unit: String
    weak var tenant: Person? // slabý odkaz na Person na zabránenie cyklu

    init(unit: String) { self.unit = unit }
    deinit { print("Apartment \(unit) sa deštruuje") }
}

var john: Person?
var unit4A: Apartment?

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

john!.apartment = unit4A
unit4A!.tenant = john // Použitie weak je kritické

john = nil
unit4A = nil
// Bez weak tenant: Obaja john a unit4A by neboli deštruuovaní.
// S weak tenant: Obaja john a unit4A sú správne deštruuovaní.