2011-10-05 31 views
2

內存泄漏我有一個與HTTPRequests的連接類。我得到了內存泄漏的「NSMutableData」本書雖然是我在「didFailWithError」,並在連接對象的「connectionDidFinishLoading」釋放它:與NSMutableData

- (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];} 

回答

5

靜態分析器會調用這個泄漏,因爲您不能保證以release爲特色的任何方法都將被實際調用。

如果設置receivedData作爲保留的性質,並做

self.receivedData = [NSMutableData data]; 
在你的dealloc

然後(也是你didFail和didFinish,而不是發佈):

self.receivedData = nil; 

你會好。

由於jbat100指出的那樣,你也出現了泄漏URL和URLRequest如果!connectionResponse,除非你從問題

+0

感謝您的回答。我試過你的解決方案,內存泄漏仍在這裏。 (我在.h文件中保留了receicvedData對象,我在dealloc中釋放了它,並在連接失敗/成功時執行了'self.receivedData = nil;'我也初始化了它,如您所說:'self.receivedData = [NSMutableData data];順便說一句 - 我的測試是在xcode文件中的 –

+0

您是否正在使用receivedData的任何其他地方,您是否也可以顯示該代碼? – jrturton

+0

我在連接方法中使用它:'[receivedData setLength: 0];''和'[receivedData appendData:data];' –

1
如果你想刪除此泄漏採取NSURLConnection的在.h文件中,並釋放

在connectionDidFinishLoading方法.reason是你在那裏分配NSURLConnection對象,但你不能釋放在那裏,如果釋放應用程序殺死那裏。那麼爲什麼你必須創建NSURLConnection對象.h

+0

的NSURLConnection的會被自動釋放,這是沒有問題的。 – jrturton

0

你爲什麼認爲你正在泄漏省略此代碼? (NSMutableData)如果是因爲Xcode的分析選項;好吧,它就在於,因爲它甚至不能處理這種明顯複雜的情況。

然而,正如納拉亞納指出的那樣,你也出現了泄漏的連接,你應該在這兩個終點釋放和失敗委託方法。

2

你需要讓真正確定這兩個委託方法是唯一可能的方式請求可以完成。我可以看到泄漏這裏

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

你不這樣做的釋放操作

[url release]; 
[urlRequest release]; 

你別當connectionResponse是非零。另一個說明我強烈建議ASIHTTP Obj C庫做這種類型的東西。

+0

感謝您的! –

+0

謝謝!!它解決了我的問題,工作得更快 –