Цель C: потенциальная утечка памяти в коде - PullRequest
2 голосов
/ 08 июня 2011

Я запустил «Анализ» в моем коде, и результат показывает потенциальную утечку памяти в следующей части моего кода

NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:urlString]];

//Potential memory leak in code below
[[NSURLConnection alloc] initWithRequest:request delegate:self];

Я не уверен, как остановить эту утечку. Я попытался добавить «autorelease» на спину, но это вызвало сбой. Любой совет по этому поводу?

EDIT:

Скриншот сообщения об утечке

enter image description here

Ответы [ 3 ]

4 голосов
/ 08 июня 2011

Отключить объект подключения в случае успеха или сбоя.Это должно остаться в живых до тех пор.Поэтому поместите релиз в методы делегата connection:didFailWithError: и connectionDidFinishLoading:.Только один позвонит.Таким образом, удержание релиза будет сбалансировано.

2 голосов
/ 08 июня 2011

Ваш вызов alloc для NSURLConnection возвращает объект со счетчиком ссылок 1. Ваш код должен выглядеть следующим образом:

NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self];
[connection start]; // This is optional.  It should begin the request after you alloc it

После того, как вы закончили с объектом, вам нужно явно вызвать:

[connection release];
1 голос
/ 06 февраля 2012

Использовать статический метод

[NSURLConnection connectionWithRequest:request delegate:self];

вместо

[[NSURLConnection alloc] initWithRequest:request delegate:self];

конечно, нет необходимости освобождать объект соединения в его методах делегата.

Или, если вы используете второй метод, освободите объект NSURLConnection в обоих методах делегата:

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error 
- (void)connectionDidFinishLoading:(NSURLConnection *)connection 

и может игнорировать предупреждающее сообщение об утечке памяти.

...