Sobes.tech
Junior — Middle

Când capturați o variabilă într-o închidere, unde este stocată — în stivă sau în heap?

sobes.tech AI

Răspuns de la AI

Când o variabilă este capturată în interiorul unei închideri în iOS (de exemplu, în Swift sau Objective-C), variabila este de obicei stocată în heap.

Acest lucru se datorează faptului că o închidere poate trăi mai mult decât cadrul de stivă în care a fost creată variabila. Pentru a păstra accesul la această variabilă după ieșirea din funcție, compilatorul o alocă în heap și închidere conține o referință la ea.

Exemplu în Swift:

func makeIncrementer() -> () -> Int {
    var count = 0
    return {
        count += 1
        return count
    }
}

let increment = makeIncrementer()
print(increment()) // 1
print(increment()) // 2

Aici, count este capturat de închidere și stocat în heap pentru a-și păstra starea între apeluri.

Prin urmare, variabilele capturate de închideri sunt plasate în heap pentru a asigura ciclul lor de viață, care depășește stiva.