2011-08-24 275 views
1
NSURL *url = [[NSURL alloc] initWithString:@"http://www.someurl.com/sample.xml"]; 
xmlParser = [[NSXMLParser alloc] initWithContentsOfURL:url]; 
[url release]; 

XMLParser *parser = [[XMLParser alloc] initXMLParser];  //50.0% 


[xmlParser setDelegate:parser]; 
parser = nil; 
[parser release]; 

[xmlParser parse];           //50.0% 
[xmlParser release]; 

這是我的解析代碼和泄漏儀器顯示泄漏。我真的不知道什麼是錯的或如何解決這個問題。有什麼建議麼?XMLParser泄漏儀器泄漏

回答

2

我有使用NSXMLParser類似的問題,但發現一個簡單的修復程序來解決內存泄漏。

而不是做

xmlParser = [[NSXMLParser alloc] initWithContentsOfURL:url]; 

執行以下操作

NSData *xmlData = [NSData dataWithContentsOfURL:[NSURL URLWithString:url]]; 
xmlParser = [[NSXMLParser alloc] initWithData:xmlData]; 

我能夠擺脫我的記憶中的泄漏

3
parser = nil; 
[parser release]; 

......這不符合你的想法。假設parser是一個屬性,然後self.parser = nilparser = nil做了非常不同的事情。前者將調用parser setter方法,該方法將釋放舊值並將屬性設置爲零。後者只是將指針從當前位置改爲零。

通過將指針設置爲零,您已經失去了對該對象的引用,因此您立即泄露了之前分配給它的對象 - 您基本上正在嘗試釋放一個零對象。您需要刪除nil呼叫,或將其放在release(見下文)之後。

您可能會考慮在之後設置一個指向nil的指針,以避免在將來嘗試訪問它時出現問題。

這裏有一些其他的問題,以幫助提供一些背景:

release Vs nil -- Best Practice

Difference between release and release then set to nil

+0

我將它改寫到一個班輪:'[解析釋放],解析器=零;'。雖然它是本地範圍,但並不需要將指針設置爲'nil' – Joost

+0

確實 - 我個人只將屬性設置爲零,而不是局部變量。而且,正如Simon在他的回答中所建議的,這不會解決解析器本身的泄漏問題! – lxt

0

有一個similar post here關於解析器泄漏。我也有這個問題。這很煩人,但它不是一個巨大的泄漏,所以我不擔心太多。將看看如果iOS 5修復了問題(如果它確實是一個已知的泄漏)

編輯:我現在有興趣看看我是否犯了上述錯誤!

+0

所以你建議我留下蜜蜂。讓我的應用程序泄漏? – Spire