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:
Um objeto toma posse de outro quando:
Com base nesses conceitos a regra da gerência de memória para as aplicações é:
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.
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.
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.