Как исправить эту потенциальную утечку памяти? - PullRequest
0 голосов
/ 20 июля 2011

Я новичок в задаче c и не понимаю, как здесь происходит утечка памяти:

MessageCustomCell *cell = [[MessageCustomCell alloc] initAutoreleaseWithLine:currentLine AndId:message.UID];
[[cell dateTime] setText:[formatter stringFromDate:message.Date]];
[[cell from] setText:message.From];
[[cell play] setTitle:@">" forState:UIControlStateNormal];    
[formatter release];   
return cell;

На обратной ячейке;В строке анализатор говорит, что существует «потенциальная утечка объекта, выделенного в строке 207 и сохраненного в ячейке».Это строка, где размещается ячейка, но я возвращаю ячейку, так как же это утечка?Заранее спасибо за помощь!

Ответы [ 4 ]

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

Проблема, основанная на имени, заключается в том, что вы пытаетесь вернуть автоматически освобожденный объект в функцию инициализации.Статический анализатор предполагает, что методы экземпляра, начинающиеся с init, возвращают владельцу вызывающую функцию (увеличенное количество сохраняемых данных), даже если вы называете его initAutorelease.То же самое касается методов, которые начинаются с new.Вы будете продолжать получать предупреждения анализатора, пока не измените имя, но то, что вы пытаетесь сделать, должно быть удобным методом класса.

//Signature
+(id)cellWithLine:(int)line andId:(NSString*)mid;

//Sample Call
[MessageCustomCell cellWithLine:currentLine andId:message.UID];
0 голосов
/ 16 ноября 2013

Перед исправлением потенциальных утечек нам нужно знать, что именно удерживать и выпускать.Retain выделяет память, Release освобождает память.

NSstring * str = [[NSstring alloc] init];Здесь мы выделяем память для переменной 'str'.В том же файле .m нам нужно освободить память для переменной после завершения ее работы.Простая запись в коде [str release];Это не приведет к утечкам памяти.

0 голосов
/ 20 июля 2011

Если имя вашего метода не начинается с «new» (как в newMessageCell), «alloc» или содержит «copy», ожидается, что возвращаемый объект будет автоматически выпущенным объектом. Ваш код возвращает объект со счетчиком ссылок, равным 1, и вызывающий себя вызывающий объект не уменьшит его выше этого. Если вызывающая сторона желает сохранить ячейку, чтобы стать ее владельцем, она сделает это.

Чтобы устранить эту утечку, просто автоматически освободите ячейку.

0 голосов
/ 20 июля 2011
return [cell autorelease];

Кроме того, вы выпускаете форматтер.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...