Что означает «Утечка возвращенного предмета» от Clang? - PullRequest
2 голосов
/ 28 апреля 2009

Далее к этот вопрос Я исправил кучу утечек памяти в BEncoding.m (изначально здесь )

Я исправил все очевидные утечки памяти, но Clang обнаружил четыре ошибки «Утечка возвращаемого объекта», которые я не уверен, как их отсортировать:

Полные сообщения / соответствующие биты кода:

NSMutableData *data = [[NSMutableData alloc] init];

[1] Метод возвращает объект Objective-C со счетом удержания +1 (ссылка на владельца)

[...]
snprintf(buffer, 32, "%lu:", [object length]);
[data appendBytes:buffer length:strlen(buffer)];
[data appendData:object];
return data;

[3] Объект, возвращаемый вызывающей стороне в качестве исходной ссылки (счетчик сохраняемых данных, переданный вызывающей стороне)

Ответы [ 3 ]

7 голосов
/ 28 апреля 2009

Вы хотите:

return [autorelease для данных];

так как вы передаете его вызывающей стороне.

3 голосов
/ 24 июня 2012

ОК, чтобы расширить ответ выше (спасибо, что поставили меня на правильный путь) ...

return [data autorelease]

Вы выделили некоторый объект "данные" и собираетесь вернуть этот объект вызывающей стороне. В Obj-C это работает так, что на некотором уровне вверх по стеку вызовов существует NSAutoreleasePool. Когда вы отправляете сообщение «autorelease» для данных, оно добавляется в этот пул autorelease. Это позволяет вызывающей стороне кратко использовать объект «данных» (т. Е. В течение всего времени кадра локального стека) без необходимости явного вызова «освобождения», и в конечном итоге, когда пул авто-выпуска «всплывает», данные будут освобождены (если кто-то называет «сохранить»). Это довольно умно.

Сладкое. Я думаю, что только что заработал свой зеленый пояс в управлении памятью Obj-C.

1 голос
/ 28 апреля 2009

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

...