Sobes.tech
Middle

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 de myFunction. Quando myFunction termina, o quadro é removido, e stackStruct é limpo automaticamente.
  • heapObject é uma referência a uma instância de MyClass, que está no heap. A variável heapObject (a referência) está na pilha. Quando myFunction termina, a referência heapObject é removida da pilha. Como essa era a única referência forte à instância MyClass("Exemplo"), o ARC detecta que o contador de referências é zero e chama deinit, libertando a memória no heap.