Junior — Middle
Keď zachytíte premennú v uzávere, kde je uložená — na zásobníku alebo na halde?
sobes.tech AI
Odpoveď od AI
Keď je premenná zachytená v uzávierke v iOS (napríklad v Swift alebo Objective-C), zvyčajne sa ukladá na haldu.
To je spôsobené tým, že uzávierka môže žiť dlhšie ako rámec zásobníka, v ktorom bola premenná vytvorená. Aby sa zachoval prístup k tejto premennej po opustení funkcie, kompilátor ju pridelení na haldu a uzávierka obsahuje odkaz na ňu.
Príklad v Swift:
func makeIncrementer() -> () -> Int {
var count = 0
return {
count += 1
return count
}
}
let increment = makeIncrementer()
print(increment()) // 1
print(increment()) // 2
Tu je count zachytená uzávierkou a uložená na haldu, aby si zachovala svoj stav medzi volaniami.
Preto sú premenné zachytené uzávierkami umiestnené na haldu, aby sa zabezpečil ich životný cyklus, ktorý presahuje zásobník.