Назад к вопросам
Junior — Middle
74
При захвате переменной внутри замыкания, где она хранится — в стеке или в куче?
Компании, где спрашивали
Магнит Тех
Ответ от нейросети
sobes.tech AI
При захвате переменной внутри замыкания в 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 захватывается замыканием и хранится в куче, чтобы сохранять своё состояние между вызовами.
Таким образом, переменные, захваченные замыканием, размещаются в куче для обеспечения их жизненного цикла, выходящего за рамки стека.