Junior — Middle
Kada uhvatite promenljivu unutar zatvarača, gde se ona čuva — u steku ili na hrpi?
sobes.tech АИ
Одговор од АИ
При захвате переменной внутри замыкания в iOS (например, в Swift или Objective-C) переменная обычно хранится в куче.
Это связано с тем, что замыкание может жить дольше, чем стековый фрейм, в котором была создана переменная. Чтобы сохранить доступ к этой переменной после выхода из функции, компилятор выделяет её в куче и замыкание содержит ссылку на неё.
Пример на Swift:
func makeIncrementer() -> () -> Int {
var count = 0
return {
count += 1
return count
}
}
let increment = makeIncrementer()
print(increment()) // 1
print(increment()) // 2
Здесь count захватывается замыканием и хранится в куче, чтобы сохранять своё состояние между вызовами.
Таким образом, переменные, захваченные замыканием, размещаются в куче для обеспечения их жизненного цикла, выходящего за рамки стека.