Estou recebendo outro vazamento de memória em um método de instância não-nulo que retorna um objeto da classe NSMutableArray.
Alguém pode me aconselhar sobre como eu posso consertar esse vazamento? Eu tentei liberar "userFollowings" no final do método, mas ainda está relatando um vazamento.
Respostas:
9 para resposta № 1Quando você deve retornar um objeto de um métodoem que você tenha inicializado ou mantido, é prática comum devolvê-lo automaticamente. Dessa forma, o usuário que recebe o objeto não precisa se preocupar em liberá-lo. Assim, sua linha final de código deve ficar assim:
return [userFollowing autorelease];
Provavelmente não faria mal ler um pouco do Guia de Programação de Gerenciamento de Memória para acompanhar as regras de gerenciamento de memória como esta, e há muitos outros recursos úteis na web e neste site.
3 para resposta № 2
tem um conjunto de convenções usado pelos programas Cocoa, que tornam o gerenciamento de memória muito menos propenso a erros. Quando um método retorna um objeto, o código que o chama precisa saber se é proprietário dele ou não.
O que se resume é que, se você está escrevendo um método que retorna um objeto e esse método não transmite a propriedade sobre o chamador ao ser chamado de algo como new
, alloc
, copy
, etc, você precisa autorelease
antes de devolvê-lo.
Isso é o que a mensagem que você está recebendo está falando - "Objeto retornado para o chamador como uma referência proprietária" significa que você está transmitindo a propriedade no código de chamada. O problema é que o nome do método indica o contrário.
Se eu chamasse seu método e precisasse pendurar no objeto, eu ligaria retain
sobre isso para que eu possuísse. Eu preciso fazer isso porque o nome do seu método implicava que eu não era o proprietário. Desde que você esteja retornando um objeto autoreleased, isso é correto. Mas se você não autorelease o objeto, ele acabará com uma contagem de retenção de 2 - uma vez quando você alocou e uma vez quando eu reter. Quando eu finalmente começar a liberá-lo, ele ainda terá uma contagem de retenção de 1, e nunca será desalocada da memória, resultando em um vazamento de memória.
2 para resposta № 3
O problema é que userFollowings
nunca é liberado. Tente terminar com
return [userFollowings autorelease];
1 para resposta № 4
Tente isto:
NSMutableArray* userfollwings = [[[NSMutableArray alloc] init] autorelease]