Sobes.tech
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.