Cum se face curățarea stivei în dezvoltarea iOS?
sobes.tech AI
Răspuns de la AI
Stiva de apeluri în iOS este curățată automat la finalizarea execuției unei funcții sau metode. Când o funcție se termină, cadrul său (set de variabile locale, argumente și adresa de returnare) este eliminat din stivă.
Pentru obiectele stocate pe stivă (de exemplu, structuri sau tipuri de date simple), curățarea are loc direct la eliminarea cadrului.
Pentru obiectele stocate în heap, la care se face referire din stivă, gestionarea automată a memoriei în iOS (ARC - Contorizarea Automată a Referințelor) joacă un rol cheie. ARC nu curăță stiva, ci gestionează durata de viață a obiectelor din heap.
Când o variabilă care conține o referință puternică la un obiect din heap iese din domeniu (ceea ce se întâmplă la eliminarea cadrului din stivă), ARC reduce automat contorul de referințe al acelui obiect. Dacă contorul ajunge la zero, ARC eliberează memoria ocupată de obiect în heap.
Prin urmare, curățarea stivei este eliminarea directă a cadrelor la finalizarea funcțiilor, iar eliberarea memoriei pentru obiectele din heap, la care făceau referire variabilele din stivă, se face indirect prin ARC.
Exemplu:
struct MyStruct {
let value: Int
}
class MyClass {
var name: String
init(name: String) {
self.name = name
print("Instanță de MyClass \(name) creată")
}
deinit {
print("Instanță de MyClass \(name) eliberată")
}
}
func myFunction() {
let stackStruct = MyStruct(value: 10) // Stocat pe stivă
let heapObject = MyClass(name: "Exemplu") // În heap, referință pe stivă
// ... lucrăm cu stackStruct și heapObject
// Funcția se termină, cadrele lui stackStruct și referința la heapObject sunt eliminate din stivă
// ARC reduce contorul de referințe al heapObject. Dacă ajunge la zero, obiectul este eliberat.
}
myFunction() // Apelarea funcției
În acest exemplu:
stackStructeste stocat direct pe stivă în cadrulmyFunction. CândmyFunctionse termină, cadrul este eliminat șistackStructeste curățat automat.heapObjecteste o referință la o instanță deMyClass, care se află în heap. VariabilaheapObject(referința) se află pe stivă. CândmyFunctionse termină, referințaheapObjecteste eliminată din stivă. Deoarece aceasta era singura referință puternică la instanțaMyClass("Exemplu"), ARC detectează că contorul de referințe este zero și apeleazădeinit, eliberând memoria din heap.