Sobes.tech
Junior — Middle

Při zachycení proměnné uvnitř uzávěru, kde je uložena — na zásobníku nebo na haldě?

sobes.tech AI

Odpověď od AI

Když je proměnná zachycena uvnitř uzávěru v iOS (například ve Swift nebo Objective-C), je proměnná obvykle uložena na haldě.

To je způsobeno tím, že uzávěr může žít déle než rámec zásobníku, ve kterém byla proměnná vytvořena. Aby bylo možné k této proměnné přistupovat i po opuštění funkce, kompilátor ji přiřadí na haldu a uzávěr obsahuje odkaz na ni.

Příklad ve Swift:

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

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

Zde je count zachycena uzávěrem a uložena na haldě, aby si zachovala svůj stav mezi voláními.

Proto jsou proměnné zachycené uzávěry umístěny na haldě, aby bylo zajištěno jejich životní cyklus, který přesahuje zásobník.