2009-04-28 5 views
2

В дополнение к this question Я исправил кучу утечек памяти в BEncoding.m (родом из here)Что означает «Утечка возвращенного объекта» от Клана?

Я исправил все очевидные утечки памяти, но 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

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

return [data autorelease] 

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

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

7

Вы хотите:

возвращение [данные автореферат];

, так как вы передаете его вызывающему абоненту.

+0

+1. пожалуйста, разверните свой ответ. Это ОЧЕНЬ туманная и запутанная тема, и эта небольшая сводка знаний почти заставила меня понять –