Como é feita a limpeza da pilha no desenvolvimento iOS?
sobes.tech IA
Resposta da IA
A pilha de chamadas em iOS é limpa automaticamente ao terminar a execução de uma função ou método. Quando uma função termina, o seu quadro (conjunto de variáveis locais, argumentos e endereço de retorno) é removido da pilha.
Para objetos armazenados na pilha (por exemplo, estruturas ou tipos de dados simples), a limpeza ocorre diretamente ao remover o quadro.
Para objetos armazenados no heap, aos quais se faz referência a partir da pilha, a gestão automática de memória em iOS (ARC - Contagem Automática de Referências) desempenha um papel fundamental. O ARC não limpa a pilha, mas gere a duração dos objetos no heap.
Quando uma variável contendo uma referência forte a um objeto no heap sai do escopo (o que acontece ao remover o quadro da pilha), o ARC reduz automaticamente o contador de referências desse objeto. Se o contador chegar a zero, o ARC liberta a memória ocupada pelo objeto no heap.
Assim, a limpeza da pilha é a remoção direta dos quadros ao terminar as funções, e a libertação de memória para objetos no heap, aos quais as variáveis na pilha fazem referência, é feita indiretamente pelo ARC.
Exemplo:
struct MyStruct {
let value: Int
}
class MyClass {
var name: String
init(name: String) {
self.name = name
print("Instância de MyClass \(name) criada")
}
deinit {
print("Instância de MyClass \(name) libertada")
}
}
func myFunction() {
let stackStruct = MyStruct(value: 10) // Armazenado na pilha
let heapObject = MyClass(name: "Exemplo") // Armazenado no heap, referência na pilha
// ... trabalhamos com stackStruct e heapObject
// A função termina, os quadros de stackStruct e a referência a heapObject são removidos da pilha
// ARC reduz o contador de referências de heapObject. Se chegar a zero, o objeto é libertado.
}
myFunction() // Chamada da função
Neste exemplo:
stackStructé armazenado diretamente na pilha dentro do quadro demyFunction. QuandomyFunctiontermina, o quadro é removido, estackStructé limpo automaticamente.heapObjecté uma referência a uma instância deMyClass, que está no heap. A variávelheapObject(a referência) está na pilha. QuandomyFunctiontermina, a referênciaheapObjecté removida da pilha. Como essa era a única referência forte à instânciaMyClass("Exemplo"), o ARC detecta que o contador de referências é zero e chamadeinit, libertando a memória no heap.