Reinaldo Junior

Um outro tech-blog

Gerenciamento de Memória em Objective-C

O gerenciamento de memória em Objective-C é feito por meio de contagem de referências. Cada objeto possui um ”retain count” que representa quantos outros objetos estão interessados nele.

Um objeto é desalocado (e a memória ocupada por ele é liberada) quando não há nenhum outro objeto interessado nele. Para impedir que ele seja desalocado um outro objeto deve demonstrar seu interesse enviando ao objeto-alvo a mensagem retain. Uma vez que um objeto não tenha mais nenhum interesse no objeto-alvo ele deve notificar o objeto por meio da mensagem release.

Resumindo: um sujeito retém (retain) objetos que ele está interessado e libera (release) objetos quando ele não está mais interessado.

A dinâmica da gerência de memória e da coleta de lixo é feita assim:
  • Quando um objeto é criado o retain count = 1 (quem criou está interessado nele, senão não teria criado =D).
  • Quando um objeto recebe uma mensagem retain o seu retain count é incrementado em 1 (o invocador da mensagem é mais um objeto interessado nele).
  • Quando um objeto recebe uma mensagem release o seu retain count é decrementado em 1 (o invocador da mensagem não está mais interessado nele).
  • Quando um objeto recebe uma mensagem autorelease o seu retain count será decrementado em 1 num futuro próximo (o invocador da mensagem não estará interessado no objeto depois do escopo atual). Para isso será utilizado um Autorelease Pool.
  • Quando um objeto tem seu retain count reduzido a 0 (zero) ele será desalocado.
Quando um objeto incrementa o retain count de outro objeto (por meio da mensagem retain, por exemplo) ele é responsável por esse retain. Na terminologia do Objective-C esse objeto (owner) passa a ter posse (ownership) sobre o outro objeto. Essa posse só é revogada quando o owner decrementa o retain count do objeto possuído (por meio das mensagens release ou autorelease).

Um objeto toma posse de outro quando:
  • Cria o objeto - usando mensagens que o nome comece com ”alloc”, ”new”, ”copy”, ”mutableCopy
  • Retém o objeto - enviando a mensagem ”retain

Com base nesses conceitos a regra da gerência de memória para as aplicações é:
Teorema: Você só deve liberar (release) objetos que você possua (ownership).
Corolário: Se você precisa armazenar um objeto recebido, você deve tomar posse dele. Geralmente você delega essa responsabilidade aos métodos accessors (@property/@synthetize).
TODO: Falar sobre Autorelease Pools e Copy.

Disclaimer: Todas essas informações foram retiradas do Memory Management Programming Guide e não tem como objetivo ser uma tradução desse guia. Esse documento é apenas um resumo de um estudo pessoal.