2010-06-25 83 views
2

我正在泄漏 returnData = [NSURLConnection sendSynchronousRequest:theRequest returningResponse:nil error:nil];在[NSURLConnection sendSynchronousRequest:theRequest returningResponse:nil error:nil]中發生泄漏漏洞

下面是我使用

NSString* curl = @"https://Some Url?ticket="; 
curl = [curl stringByAppendingString:self.ticket]; 
curl = [curl stringByAppendingString:@"&apikey=hjgajgfjaghjf&XMLString="]; 
curl = [curl stringByAppendingString:stringB]; 
curl = [curl stringByReplacingOccurrencesOfString:@"\n" withString:@""]; 
NSURL *finalURL = [NSURL URLWithString:curl]; 

    NSMutableURLRequest *theRequest = [NSMutableURLRequest requestWithURL:finalURL cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:10]; 
    [theRequest setHTTPMethod:@"POST"]; 

    NSData* returnData= [NSURLConnection sendSynchronousRequest:theRequest returningResponse:nil error:nil]; 

任何一個可以告訴我,爲什麼我得到的泄漏returndata我relased的returndata並嘗試過,但還是我收到的代碼。

謝謝你

回答

9

從你發佈的代碼,沒有泄漏。當你最終返回returnData時,調用者可能會保留它並忘記釋放它,但是你提供的代碼片段中的所有對象都是自動釋放的,並且會在當前runloop結束時釋放。

幾件事我能想到的:

  1. 你也許在後臺線程中運行這個(通過performSelectorInBackground:withObject:或有明確的NSThread分配)和遺忘創建和後來漏的NSAutoreleasePool圍繞代碼?

  2. 您可能會將內存綁在NSURLConnection的緩存中。你沒有提到什麼會導致你認爲returnData被泄漏,但是如果它只是這個區域的內存損失(而不是泄漏儀器專門標記returnData對象),那麼你可以通過清除喜歡的東西[[NSURLCache sharedURLCache] removeAllCachedResponses];

  3. 雖然不涉及任何真正的泄漏有NSURLConnection的緩存明確,這將是稍微更有效地建立使用NSString-stringWithFormat:而不是多次打電話給你-stringByAppendingString: URL字符串。同樣,所有東西都是自動釋放的,所以在字符串處理中沒有泄漏,但是在下一次NSAutoreleasePool耗盡之前,您會創建更少的臨時對象並減少峯值內存使用量。

我想找一個解決方案的頭號位置將在此代碼的調用者。賠率非常好,它保留了此方法的返回值,並且在某些時候沒有正確釋放它。它也可以將返回分配給一個保留的@property而不是最終將該屬性清零-dealloc儀器會告訴您泄漏內存的位置是首次分配的,但它無法知道泄漏實際發生的位置 - 何時包含指針的最後一個變量被覆蓋或超出範圍。

如果您還沒有,請嘗試使用Xcode的構建和分析功能編譯您的代碼。通過該功能運行的CLANG靜態分析儀通常可以計算出您的上一次參考丟失的位置,而不是儀器中的運行時動態分析。

祝你好運,跟蹤下來!泄漏是從來沒有樂趣....

1

我有問題的相反。我無法清除緩存。所以這就是我所做的:我添加了另一對,這將永遠是不同的,使URL總是有點不同。我說:

[...] 

curl = [curl stringByAppendingString:@"&hello=hello"]; 

curl = [curl stringByAppendingString:nowStr]; 

where nowStr: 

NSDate *now = [NSDate date]; 

NSString * nowStr = [NSString stringWithFormat:@"%@", now]; 

nowStr = [nowStr stringByReplacingOccurancesOfString:@" " withString:@""]; 

nowStr = [nowStr stringByReplacingOccurancesOfString:@"+" withString:@""]; 

我相信我應該用什麼做的一個隨機數,也許我會在後面做。