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.