утечка памяти с NSMutableData - PullRequest
2 голосов
/ 05 октября 2011

У меня есть класс для соединения с httprequests. Я получаю утечку памяти для «NSMutableData», хотя я освобождаю ее в «didFailWithError» и в «connectionDidFinishLoading» объекта подключения:

- (BOOL)startRequestForURL:(NSURL*)url {

[url retain];


NSMutableURLRequest* urlRequest = [[NSMutableURLRequest alloc] initWithURL:url];
// cache & policy stuff here
[[NSURLCache sharedURLCache] removeAllCachedResponses];
[urlRequest setHTTPMethod:@"POST"];
[urlRequest setHTTPShouldHandleCookies:YES];
NSURLConnection* connectionResponse = [[[NSURLConnection alloc] initWithRequest:urlRequest delegate:self] autorelease];
if (!connectionResponse)
{
    // handle error
    return NO;
} else {
    receivedData = [[NSMutableData data] retain]; // memory leak here!!!
}

[url release];

[urlRequest release];


return YES;}

- (void)connection:(NSURLConnection*)connection didFailWithError:(NSError*)error {
UIAlertView *alert =
[[[UIAlertView alloc]
  initWithTitle:NSLocalizedString(@"Connection problem", nil)
  message:NSLocalizedString(@"A connection problem detected. Please check your internet connection and try again.",nil)

  delegate:self
  cancelButtonTitle:NSLocalizedString(@"OK", nil)
  otherButtonTitles:nil, nil]
 autorelease];
[alert show];

[connectionDelegate performSelector:failedAction withObject:error];
[receivedData release];}

- (void)connectionDidFinishLoading:(NSURLConnection*)connection {
[connectionDelegate performSelector:succeededAction withObject:receivedData];
[receivedData release];}

Ответы [ 4 ]

5 голосов
/ 05 октября 2011

Статический анализатор назовет это утечкой, потому что вы не гарантируете, что на самом деле будет вызван любой из методов с release.

Если вы установите receivedData в качестве сохраняемого свойства и выполните

self.receivedData = [NSMutableData data];

Затем в вашем dealloc (а также в ваших didFail и didFinish вместо выпуска):

self.receivedData = nil;

С тобой все будет в порядке.

Как указывает jbat100, вы также пропускаете url и urlRequest, если! ConnectionResponse, если только вы не пропустили этот код в вопросе

2 голосов
/ 05 октября 2011

Необходимо убедиться, что эти два метода делегата являются единственным возможным способом завершения запроса.Я вижу утечку здесь

if (!connectionResponse)
{
    // handle error
    return NO;
}

вы не выполняете операции освобождения

[url release];
[urlRequest release];

То, что вы делаете, когда connectionResponse не ноль.С другой стороны, я настоятельно рекомендую использовать библиотеку ASIHTTP Obj C для подобных вещей.

1 голос
/ 05 октября 2011

Если вы хотите устранить эту утечку, возьмите NSURLConnection в файле .h и освободите его в методе connectionDidFinishLoading .reason - вы выделены там NSURLConnection, но вы не можете освободить его там, если выпустите приложение, убивающее там. Вот почему вы должнысоздать NSURLConnection объект в .h

0 голосов
/ 05 октября 2011

Почему вы думаете, что у вас течь? (NSMutableData) Если это из-за опции анализа Xcode; Что ж, это ложь, поскольку она не может справиться даже с такими очевидными сложными ситуациями.

Однако, как указал Нараяна, вы также теряете соединение, которое вы должны освободить в методах завершения и сбоя делегата.

...