Middle
V čom spočíva rozdiel medzi zberačom odpadu (garbage collector) a automatickým riadením pamäte (ARC)?
sobes.tech AI
Odpoveď od AI
Automatický zberač odpadu automaticky nachádza a uvoľňuje pamäť, ktorá už nie je používaná programom. Funguje na pozadí, periodicky skenuje haldu a identifikuje objekty, na ktoré neexistujú aktívne odkazy.
ARC (Automatic Reference Counting) v Swift a Objective-C riadi životnosť objektov počítaním počtu silných odkazov na každý objekt. Keď počet silných odkazov na objekt dosiahne nulu, ARC automaticky uvoľní pamäť obsadenú týmto objektom.
Hlavné rozdiely:
| Funkcia | Zberač odpadu | ARC |
|---|---|---|
| Princíp práce | Vyhľadávanie nedosiahnuteľných objektov | Počítanie silných odkazov |
| Moment uvoľnenia | Nedeterministický, pri skenovaní | Deterministický, pri 0 odkazoch |
| Náklady na overhead | Pauzy pri vykonávaní programu (pri zbere) | Malé, pri zmene počtu odkazov |
| Predvídateľnosť | Nízka | Vysoká |
| Cyklické odkazy | Vyžadujú špeciálne prístupy (napr. slabé odkazy) | Vyžadujú použitie weak alebo unowned odkazov |
| Použitie v iOS | Nie je dostupné v modernom Objective-C a Swift | Hlavný mechanizmus správy pamäti v Objective-C a Swift |
Príklad použitia weak na zabránenie cyklu silných odkazov v ARC:
class Person {
let name: String
var apartment: Apartment? // silný odkaz
init(name: String) {
self.name = name
print("\(name) sa inicializuje")
}
deinit {
print("\(name) sa deinitializuje")
}
}
class Apartment {
let unit: String
weak var tenant: Person? // slabý odkaz
init(unit: String) {
self.unit = unit
print("Apartment \(unit) sa inicializuje")
}
deinit {
print("Apartment \(unit) sa deinitializuje")
}
}
var john: Person?
var unit4A: Apartment?
john = Person(name: "John Appleseed")
unit4A = Apartment(unit: "4A")
john!.apartment = unit4A
unit4A!.tenant = john // slabý odkaz zabraňuje cyklu držania
john = nil // objekt Person sa deinitializuje
unit4A = nil // objekt Apartment sa deinitializuje