2009-10-21 103 views
9

我有以下代碼泄漏。儀器說它是rssParser對象泄漏。 I 「刷新」 XML進料和它運行塊和它泄漏....NSXMLParser泄漏

file.h

@interface TestAppDelegate : NSObject <UIApplicationDelegate> { 

    NSXMLParser *rssParser; 

} 

file.m

NSData *data = [ NSURLConnection sendSynchronousRequest:request returningResponse: nil error: nil ]; 
    rssParser = [[NSXMLParser alloc] initWithData:data]; 
    [rssParser setDelegate:self]; 
    [rssParser setShouldProcessNamespaces:NO]; 
    [rssParser setShouldReportNamespacePrefixes:NO]; 
    [rssParser setShouldResolveExternalEntities:NO]; 
    [rssParser parse]; 
    [rssParser release]; 

的泄漏圖像....

alt text http://www.shipfinder.co.uk/images/memoryleak.png

+1

請注意,三個setShould *語句全部默認爲NO,因此您可以從代碼中刪除這些語句。 – 2009-10-21 17:34:20

回答

10

蘋果已經回來給我,這是一個bug#6469143

看起來他們計劃定爲4.0

+0

你有沒有收到蘋果公司關於這個Bug的回覆? – 2010-06-30 14:56:48

+2

我得到了同樣的泄漏,這個泄漏修復在4.0 – kiri 2010-07-01 19:23:17

+1

嗯,我仍然看到它在iOS4 SDK中。我還沒有下載最新的 – philsquared 2010-07-29 13:11:29

3

最可能的原因是,你的委託方法之一保留解析器。你是否在委託方法中使用瞭解析器參數?

每次刷新時都會發生泄漏嗎?

如果這是唯一使用rssParser的地方,那你爲什麼要把它變成伊娃?如果你確實需要一個伊娃,我總是不能強調它總是使用訪問器對他們來說是多麼重要,並且決不會直接訪問它們。避免內存泄漏的最好方法是爲你的ivars使用訪問器。

此外,不要立即釋放一些東西,而不立即將其設置爲其他東西(通常爲零)。你上面發佈的rssParser是一個等待發生的崩潰,因爲你現在有一個指向可能未分配內存的指針。

+0

是的,我每次都得到泄漏,我已經做出了你所描述的改變,因爲它不應該是伊娃。仍然泄漏! – 2009-10-21 19:17:18

+0

你有Xcode 3.2(來自SnowLeopard)嗎?構建和分析工具非常適合尋找簡單的泄漏。 – 2009-10-22 00:13:17

+0

是的,我已經試過了。 – 2009-10-22 03:12:37

0

似乎這是一個衆所周知的問題。在這裏看到NSURLConnection leaking。 但是,如果你設置以下之前初始化解析器泄漏停止:

[[NSURLCache sharedURLCache] setMemoryCapacity:0]; 
[[NSURLCache sharedURLCache] setDiskCapacity:0]; 
NSXMLParser *parser = [[NSXMLParser alloc]initWithContentsOfURL:URL]; 
+0

其實蘋果回到我身邊,這個問題已經記錄爲6469143.不知道他們什麼時候會修復它。仍然泄漏改變你的做法! – 2009-11-11 13:28:50

0

我只是通過使用this post中列出的方法來解決這個問題。

這是一個解決方法,但它的工作原理。

另一方面,我發現儀器在Lion/Xcode 4.1中可靠地工作,如果你總是在設備上運行它,而不是模擬器。在模擬器上,似乎有一個附加在過程上的魔鬼。

NSXMLParser實現似乎自然會泄漏。在我的應用程序的其他地方有另一個泄漏,我需要看看我是否可以確定。這是一個異乎尋常的呼籲,而這個解決方案似乎不適用於此。