Задача C: Утечка памяти в методе без пустот - PullRequest
1 голос
/ 03 июля 2011

Я получаю еще одну утечку памяти в методе non-void, который возвращает объект класса NSMutableArray.

enter image description here

Может кто-нибудь посоветовать мне, как я могу исправить эту утечку?Я пытался освободить userFollowings в конце метода, но он все еще сообщает об утечке.

Ответы [ 4 ]

9 голосов
/ 03 июля 2011

Когда вы должны вернуть объект из метода, в котором вы либо инициализировали его, либо сохранили его, обычной практикой является возврат его автоматически освобожденным. Таким образом, пользователь, получающий объект, не должен беспокоиться о его освобождении. Итак, ваша последняя строка кода должна выглядеть так:

return [userFollowing autorelease];

Вероятно, было бы неплохо почитать немного из Руководства по программированию управления памятью , чтобы узнать о правилах управления памятью, таких как эта, и есть много других полезных ресурсов в Интернете и этот сайт.

3 голосов
/ 03 июля 2011

Существует набор соглашений , используемых программами Какао, которые делают управление памятью намного менее подверженным ошибкам.Когда метод возвращает объект, код, вызывающий его, должен знать, владеет ли он им или нет.

То, к чему он сводится, заключается в том, что если вы пишете метод, который возвращает объект, и этот метод не 'Чтобы передать право собственности вызывающему абоненту, назвав его как-то вроде new, alloc, copy и т. д., вам нужно autorelease, прежде чем вернуть его.

Это то, что вы сообщаетео чем идет речь - «Объект, возвращенный вызывающей стороне как ссылка-владелец» означает, что вы передаете право собственности на вызывающий код.Проблема в том, что имя вашего метода указывает на иное.

Если бы я вызвал ваш метод и мне нужно было висеть на объекте, я бы вызвал на него retain, чтобы он мне принадлежал.Мне нужно сделать это, потому что название вашего метода подразумевает, что я не владелец.До тех пор, пока вы возвращаете автоматически выпущенный объект, это правильно.Но если вы не высвободите объект автоматически, он получит счет 2: один раз, когда вы его выделили, и один раз, когда я его сохранил.Когда я наконец доберусь до его освобождения, он все равно будет иметь счет сохранения 1 и никогда не будет освобожден из памяти, что приведет к утечке памяти.

2 голосов
/ 03 июля 2011

Проблема в том, что userFollowings никогда не выпускается.Попробуйте закончить с

return [userFollowings autorelease];
1 голос
/ 03 июля 2011

Попробуйте это:

   NSMutableArray* userfollwings = [[[NSMutableArray alloc] init] autorelease]
...