Kaip vyksta atminties išlaisvinimas naudojant nuorodų tipą sukurtiems objektams?
sobes.tech AI
Atsakymas iš AI
iOS, objektai, sukurti naudojant nuorodų tipus (pavyzdžiui, Swift ar Objective-C klases), valdomi automatinio nuorodų skaičiavimo (ARC — Automatic Reference Counting) sistemos. Kiekvienas objektas saugo nuorodų skaitiklį — aktyvių nuorodų į jį skaičių. Kai sukuriama nauja nuoroda į objektą, skaitiklis padidėja, o kai nuoroda nebenaudojama (pavyzdžiui, kintamasis išeina iš apimties arba jam priskiriama nil), skaitiklis sumažėja.
Kai objekto nuorodų skaitiklis pasiekia nulį, tai reiškia, kad į jį nebežvelgia niekas, ir atmintis, kurią užima objektas, automatiškai atlaisvinama. Tai padeda išvengti atminties nutekėjimo be rankinio valdymo.
Swift pavyzdys:
class Person {
var name: String
init(name: String) {
self.name = name
}
deinit {
print("Asmuo \(name) atlaisvintas")
}
}
var p1: Person? = Person(name: "Ivan")
var p2 = p1 // nuorodų skaitiklis padidėjo
p1 = nil // skaitiklis sumažėjo, bet objektas vis dar gyvas
p2 = nil // skaitiklis pasiekė 0, objektas atlaisvintas
Svarbu išvengti ciklinių nuorodų (retain cycles), kai du objektai vienas kitą nurodo, kas trukdo atlaisvinti atmintį. Tam naudojamos weak arba unowned nuorodos.