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
releasealebodealloc. - 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.