Intern
Mis on prügikoristaja (garbage collector)?
sobes.tech AI
Vastus AI-lt
iOS-s ei ole traditsioonilist prügikoristajat. Selle asemel kasutatakse Automatic Reference Counting (ARC) mehhanismi.
- Automaatne mehhanism: ARC arvutab automaatselt objekti tugevate viidete arvu.
- Mälu vabastamine: Kui objekti tugevate viidete arv jõuab nullini, vabastab ARC eraldatud mälu.
- Vältimaks mälu lekked: Õige tugevate, nõrkade ja omandamatute (unowned) viidete kasutamine võimaldab vältida mälu lekked ja tugevate viidete tsüklid.
ARC viidete tüübid:
- Tugev (strong): Suurendab viidete loendurit. Vaikimisi.
- Nõrk (weak): Ei suurenda viidete loendurit. Automaatselt muutub
nil-iks objekti deallocatsiooni ajal. Kasutatakse tugevate viidete tsüklite vältimiseks. Deklareerub valikulise tüübina. - Omandamatu (unowned): Ei suurenda viidete loendurit. Tagab, et viidatud objekt eksisteerib kogu elutsükli vältel. Ei ole valikulise tüübina. Kasutatakse, kui kaks objekti omavad vastastikuseid tugevaid seoseid, kuid üks neist on lühem elutsükkel.
ARC eelised:
- Prognoositavus: Mälu vabastamine toimub määratletult, niipea kui objekt ei ole enam kasutusel.
- Tõhusus: Ei ole taustal toimiva prügikoristaja lisakulusid, mis võiksid põhjustada pause.
- Lihtsus: Arendaja ei pea enamikul juhtudel mälu käsitsi haldama, kuid peab mõistma viidete loendamise põhimõtteid, et vältida lekked.
Näide tugeva viite tsüklist:
class Person {
let name: String
var apartment: Apartment? // tugev viide Apartment-ile
init(name: String) { self.name = name }
deinit { print("\(name) deinitialiseeritakse") }
}
class Apartment {
let unit: String
weak var tenant: Person? // nõrk viide Person-ile, tsükli vältimiseks
init(unit: String) { self.unit = unit }
deinit { print("Apartment \(unit) deinitialiseeritakse") }
}
var john: Person?
var unit4A: Apartment?
john = Person(name: "John Appleseed")
unit4A = Apartment(unit: "4A")
john!.apartment = unit4A
unit4A!.tenant = john // Kasutades weak, see on väga oluline
john = nil
unit4A = nil
// Ilma weak tenant-ita: Mõlemad john ja unit4A ei deinitialiseeru.
// Weak tenant-iga: Mõlemad john ja unit4A deinitialiseeruvad õigesti.