Middle
Kuo skiriasi šiukšlių rinkėjas (garbage collector) nuo automatinės atminties valdymo (ARC)?
sobes.tech AI
Atsakymas iš AI
Automatinis atminties surinkėjas automatiškai suranda ir atlaisvina atmintį, kuri nebenaudojama programos. Jis veikia foniniame režime, periodiškai skenuodamas krūvą ir identifikuodamas objektus, į kuriuos nėra aktyvių nuorodų.
ARC (Automatic Reference Counting) Swift ir Objective-C valdo objektų gyvavimą skaičiuodamas stiprių nuorodų skaičių kiekvienam objektui. Kai stiprių nuorodų skaičius pasiekia nulį, ARC automatiškai atlaisvina tą objektą užimančią atmintį.
Pagrindiniai skirtumai:
| Savybė | Atminties surinkėjas | ARC |
|---|---|---|
| Darbo principas | Nedarbingų objektų paieška | Stiprių nuorodų skaičiavimas |
| Atlaisvinimo momentas | Nedirbantis, skenavimo metu | Nedarbinis, kai nuorodų skaičius 0 |
| Išlaidos | Pertraukimai programos vykdyme | Mažos, keičiant skaitiklį |
| Prognozuojamumas | Žemas | Aukštas |
| Ciklinės nuorodos | Reikalauja specialių metodų (pvz., silpnos nuorodos) | Reikalauja weak arba unowned nuorodų |
| Naudojimas iOS'e | Nėra prieinama šiuolaikiniame Objective-C ir Swift | Pagrindinis atminties valdymo mechanizmas Objective-C ir Swift |
Pavyzdys, kaip naudoti weak, siekiant išvengti stiprių nuorodų ciklo ARC:
class Person {
let name: String
var apartment: Apartment? // stipri nuoroda
init(name: String) {
self.name = name
print("\(name) inicijuojamas")
}
deinit {
print("\(name) deinicijuojamas")
}
}
class Apartment {
let unit: String
weak var tenant: Person? // silpna nuoroda
init(unit: String) {
self.unit = unit
print("Apartment \(unit) inicijuojamas")
}
deinit {
print("Apartment \(unit) deinicijuojamas")
}
}
var john: Person?
var unit4A: Apartment?
john = Person(name: "John Appleseed")
unit4A = Apartment(unit: "4A")
john!.apartment = unit4A
unit4A!.tenant = john // silpna nuoroda išvengia ciklo
john = nil // Person objektas deinicijuojamas
unit4A = nil // Apartment objektas deinicijuojamas