Kuidas toimub mälu vabastamine viidetüüpi kasutavate objektide puhul?
sobes.tech AI
Vastus AI-lt
iOS-is, objektid, mis on loodud viidetüüpide (näiteks Swift või Objective-C klasside) abil, hallatakse automaatse viidete loendamise (ARC — Automatic Reference Counting) süsteemi kaudu. Iga objekt hoiab enda juures viidete loendurit — aktiivsete viidete arvu sellele. Kui uue viite objekti juurde luuakse, suureneb loendur, ja kui viide enam ei kasutata (näiteks muutuja väljub ulatusest või määratakse nil-iks), väheneb loendur.
Kui objekti viidete loendur jõuab nulli, tähendab see, et sellele ei viita enam keegi, ning objekti poolt kasutatud mälu vabastatakse automaatselt. See aitab vältida mälu lekked ilma käsitsi haldamiseta.
Swift näide:
class Person {
var name: String
init(name: String) {
self.name = name
}
deinit {
print("Isik \(name) vabastati")
}
}
var p1: Person? = Person(name: "Ivan")
var p2 = p1 // viidete loendur suurenes
p1 = nil // loendur vähenes, kuid objekt on endiselt olemas
p2 = nil // loendur on 0, objekt on vabastatud
Oluline on vältida tsüklilisi viiteid (retain cycles), kui kaks objekti viitavad üksteisele, mis takistab mälu vabastamist. Selleks kasutatakse weak või unowned viiteid.