Sobes.tech
Junior

Čo je ARC (Automatické počítanie referencií) v iOS?

sobes.tech AI

Odpoveď od AI

ARC je mechanizmus správy pamäte v iOS, ktorý automaticky počíta odkazy na objekty. Keď počet odkazov na objekt dosiahne nulu, ARC automaticky uvoľní pamäť obsadenú týmto objektom.

Výhody ARC:

  • Zníženie únikov pamäte: Automatizácia procesu uvoľňovania pamäte znižuje pravdepodobnosť chýb spojených s zabudnutými release alebo dealloc.
  • Zníženie pádov spôsobených dvojitým uvoľnením: ARC zabraňuje pokusom o uvoľnenie už uvoľnenej pamäte.
  • Zjednodušenie kódu: Vývojár nemusí ručne spravovať pamäť, čo robí kód čistejším a prehľadnejším.

Napriek automatizácii je pri používaní ARC dôležité pochopiť koncepty silných a slabých odkazov, aby sa predišlo cyklom silných odkazov (retain cycles).

Príklad silného odkazu:

class Person {
    var name: String
    var apartment: Apartment?

    init(name: String) {
        self.name = name
        print("\(name) je inicializovaný")
    }

    deinit {
        print("\(name) je odstraňovaný")
    }
}

class Apartment {
    var unit: String
    var tenant: Person? // Silný odkaz

    init(unit: String) {
        self.unit = unit
        print("Apartment \(unit) je inicializovaný")
    }

    deinit {
        print("Apartment \(unit) je odstraňovaný")
    }
}

var john: Person?
var unit4A: Apartment?

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

// Vytvorenie silného odkazu na oboch stranách
john!.apartment = unit4A
unit4A!.tenant = john

// Vymazanie odkazov nevedie k deinit kvôli cyklu
john = nil
unit4A = nil

Príklad použitia slabého odkazu na prerušenie cyklu:

class Person {
    var name: String
    var apartment: Apartment?

    init(name: String) {
        self.name = name
        print("\(name) je inicializovaný")
    }

    deinit {
        print("\(name) je odstraňovaný")
    }
}

class Apartment {
    var unit: String
    weak var tenant: Person? // Slabý odkaz

    init(unit: String) {
        self.unit = unit
        print("Apartment \(unit) je inicializovaný")
    }

    deinit {
        print("Apartment \(unit) je odstraňovaný")
    }
}

var john: Person?
var unit4A: Apartment?

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

john!.apartment = unit4A
unit4A!.tenant = john

// Vymazanie odkazov vedie k deinit (cyklus je prerušení)
john = nil // Person odstraňovaný
unit4A = nil // Apartment odstraňovaný

ARC sa vzťahuje na objekty tried. Štruktúry a enumerácie sú typy-hodnoty a nie sú automaticky spravované pomocou ARC.