Sobes.tech
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.