Kuidas toimub iOS arenduses virna puhastamine?
sobes.tech AI
Vastus AI-lt
iOS-teenus kutsed järk automaatselt puhastatakse, kui funktsioon või meetod lõppeb. Kui funktsioon lõpeb, eemaldatakse selle raam (paiksete muutujate, argumentide ja tagasipöördumise aadressi kogum) virnast.
Virnast paiknevad objektid (näiteks struktuurid või lihtsad andmetüübid) puhastatakse otse raamest eemaldamisega.
Heap-ile (kõrvale) paigutatud ja virnas hoitavad viited objektidele mängivad iOS-is (ARC - Automatic Reference Counting) olulist rolli. ARC ei puhasta virna, kuid haldab heap-ile paigutatud objektide eluea aega.
Kui muutuja, mis sisaldab tugevat viidet heap-ile paigutatud objekti, väljub nähtavuspiirkonnast (mis juhtub, kui eemaldatakse funktsiooni raam virnast), vähendab ARC automaatselt selle objekti viidete arvu. Kui viidete arv jõuab nullini, vabastab ARC mälu, mida objekt heap-ile hõivab.
Seega on virna puhastamine otsene raamide eemaldamine funktsioonide lõppedes, kuid mälu vabastamine heap-ile viitavatest objektidest toimub kaudselt ARC kaudu.
Näide:
struct MyStruct {
let value: Int
}
class MyClass {
var name: String
init(name: String) {
self.name = name
print("MyClass'i eksemplar \(name) loodud")
}
deinit {
print("MyClass'i eksemplar \(name) vabastatud")
}
}
func myFunction() {
let stackStruct = MyStruct(value: 10) // Paigutatud virnale
let heapObject = MyClass(name: "Example") // Paigutatud virnale, viide virnas
// ... töötame koos stackStruct ja heapObject
// Funktsioon lõppeb, stackStruct ja viide heapObject eemaldatakse virnast
// ARC vähendab heapObject viidete arvu. Kui see on 0, objekt vabastatakse.
}
myFunction() // Funktsiooni kutsumine
Selles näites:
stackStructpaikneb otse virnasmyFunctionraames. KuimyFunctionlõppeb, eemaldatakse raam jastackStructpuhastatakse automaatselt.heapObjecton viideMyClasseksemplarile, mis asub heap-ile. Enda muutujanaheapObject(viide) asub virnas. KuimyFunctionlõppeb, eemaldatakseheapObjectviide virnast. Kuna see oli ainus tugev viideMyClass("Example")eksemplarile, tuvastab ARC, et viidete arv on 0 ja kutsubdeinit, vabastades mälu heap-ilt.