Утечка памяти с NSMutableData
У меня есть класс для связи с 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 ответа
Статический анализатор назовет это утечкой, потому что вы не гарантируете, что какой-либо из методов, показывающих release
на самом деле будет называться.
Если вы установите receivedData
в качестве оставшейся собственности, и сделать
self.receivedData = [NSMutableData data];
Затем в ваш dealloc (а также ваши didFail и didFinish вместо релиза):
self.receivedData = nil;
С тобой все будет хорошо.
Как указывает jbat100, вы также пропускаете url и urlRequest, если! ConnectionResponse, если только вы не пропустили этот код в вопросе
Вы должны убедиться, что эти два метода делегата являются единственным возможным способом завершения запроса. Я вижу утечку здесь
if (!connectionResponse)
{
// handle error
return NO;
}
Вы не делаете операции выпуска
[url release];
[urlRequest release];
Что вы делаете, когда connectionResponse не ноль. С другой стороны, я настоятельно рекомендую использовать библиотеку ASIHTTP Obj C для подобных вещей.
Если вы хотите устранить эту утечку, возьмите NSURLConnection в файле.h и освободите его в методе connectionDidFinishLoading.reason - это то, что вам выделен объект NSURLConnection, но вы не можете освободить его там, если выпустите приложение, убивающее там., поэтому вы должны создать объект NSURLConnection в.ч
Почему вы думаете, что вы протекаете? (NSMutableData
) Если это из-за опции анализа Xcode; Что ж, это ложь, поскольку она не может справиться даже с такими очевидными сложными ситуациями.
Однако, как указал Нараяна, вы также теряете соединение, которое вы должны освободить как в методах завершения, так и в случае сбоя делегата.