/ / Objective C: Memory Leak no método de instância não vazia - objective-c, ios, vazamentos de memória

Objetivo C: Vazamento de memória no método de instância não vazia - objetivo-c, ios, vazamentos de memória

Estou recebendo outro vazamento de memória em um método de instância não-nulo que retorna um objeto da classe NSMutableArray.

insira a descrição da imagem aqui

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 № 1

Quando 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]