Junior — Middle
Ao capturar uma variável dentro de um closure, onde ela é armazenada — na pilha ou no heap?
sobes.tech IA
Resposta da IA
Quando uma variável é capturada dentro de um encerramento em iOS (por exemplo, em Swift ou Objective-C), a variável geralmente é armazenada no heap.
Isto ocorre porque um encerramento pode viver mais do que o quadro de pilha em que a variável foi criado. Para manter o acesso a essa variável após sair da função, o compilador a aloca no heap e o encerramento contém uma referência a ela.
Exemplo em Swift:
func makeIncrementer() -> () -> Int {
var count = 0
return {
count += 1
return count
}
}
let increment = makeIncrementer()
print(increment()) // 1
print(increment()) // 2
Aqui, count é capturado pelo encerramento e armazenado no heap para manter seu estado entre chamadas.
Assim, variáveis capturadas por encerramentos são colocadas no heap para garantir seu ciclo de vida, que vai além da pilha.