Hogyan történik a verem tisztítása iOS fejlesztésben?
sobes.tech MI
Válasz az MI-től
Az iOS-ban a hívási verem automatikusan törlődik, amikor egy függvény vagy metódus végrehajtása befejeződik. Amikor egy függvény véget ér, annak kerete (a helyi változók, argumentumok és visszatérési cím összessége) eltávolításra kerül a veremből.
A veremben tárolt objektumokhoz (például struktúrákhoz vagy egyszerű adat típusokhoz) a tisztítás közvetlenül a keret eltávolításakor történik.
A heapen (kupán) tárolt objektumokhoz, amelyekre a veremből hivatkoznak, az iOS automatikus memória kezelése (ARC - Automatikus Referencia Számlálás) kulcsszerepet játszik. Az ARC nem tisztítja a veremet, hanem az objektumok életciklusát kezeli a heapen.
Amikor egy változó, amely erős hivatkozást tartalmaz egy heapen lévő objektumra, kilép a hatókörből (ami a verem keretének eltávolításakor történik), az ARC automatikusan csökkenti az adott objektum referencia számlálóját. Ha a számláló nullára csökken, az ARC felszabadítja az objektum által foglalt memóriát a heapen.
Így a verem tisztítása a függvények befejezésekor közvetlenül a keretek eltávolításával történik, és a heapen lévő objektumok memória felszabadítása, amelyekre a veremben lévő változók hivatkoznak, közvetve az ARC által történik.
Példa:
struct MyStruct {
let value: Int
}
class MyClass {
var name: String
init(name: String) {
self.name = name
print("MyClass példány \(name) létrehozva")
}
deinit {
print("MyClass példány \(name) felszabadítva")
}
}
func myFunction() {
let stackStruct = MyStruct(value: 10) // A veremben tárolva
let heapObject = MyClass(name: "Példa") // A heapen, a veremben lévő referencia
// ... dolgozunk a stackStruct és heapObject változókkal
// A függvény befejeződik, a stackStruct és a heapObject referencia eltávolításra kerül a veremből
// ARC csökkenti a heapObject referencia számlálóját. Ha nulla, az objektum felszabadul.
}
myFunction() // Függvényhívás
Ebben a példában:
- A
stackStructközvetlenül amyFunctionkeretében van a veremben. Amikor amyFunctionbefejeződik, a keret eltávolításra kerül, és astackStructautomatikusan tisztul. - A
heapObjectegyMyClasspéldányra mutató referencia, amely a heapen található. AheapObjectváltozó a veremben van. Amikor amyFunctionbefejeződik, aheapObjectreferencia eltávolításra kerül a veremből. Mivel ez volt az egyetlen erős referencia aMyClass("Példa")példányra, az ARC észleli, hogy a referencia számláló nulla, meghívja adeinit-et, és felszabadítja a heapen lévő memóriát.