2009-11-03 10 views
1

我使用NSXMLParser構建了一個分析算法。 我很懷疑什麼是保持我的內存使用最少的最佳策略。NSXMLParser用於大型XML的iPhone內存策略

我有一個valueObject(例如「Person」)這個對象有30個NSString屬性,當解析xml時,我會在遍歷節點時不斷地分配和釋放臨時Person對象。 我檢查了這一點,並且這些Person對象中只有一個在任何時候被實例化。 當一個節點被遍歷並且一個Person是「build」時,我將該Person傳遞給一個NSMutableArray並釋放這個Person。似乎沒有問題。 (我需要一個tableView的數組)。 當我到達數組中的50個Person對象時,我的應用程序剛剛退出,didReceiveMemoryWarning不會被調用,沒有其他警告,沒有parseErrorOccurred,什麼都沒有?

如果我限制了xml中的人數,那麼應用程序確實沒什麼問題,但我還是無法使用Instruments找到任何內存泄漏。 我認爲我根本無法在數組中保存50個以上的Person對象...似乎有點苛刻,但我對iPhone沒有太多的內存體驗,所以這只是一個猜測。

xml是搜索結果,用戶可能只需要幾個搜索結果,因此將它們保留在我的核心模型中以便讓它們保持顯示似乎有點瘋狂。

保持這些Person對象的好方法是什麼?還是我錯過了一個巨大的內存泄漏,因爲iPhone應該能夠處理更多的內容?

希望有經驗的開發人員可以點我在正確的方向:)

謝謝!

+1

一些示例代碼將是有益 – ACBurk 2009-11-03 22:44:11

回答

1

這些字符串有多長?一般來說,在iPhone 3G和老款機型上,您的應用程序應該至少有20 MB的可用內存(更多在3G上)。當然,這不是絕對的規則,而是一個體面的經驗法則。要用50個對象佔據這麼多的內存,意味着每個Person對象需要400-500 KB。這是在球場嗎?如果是這樣,你可能需要一種內存管理策略,它不會同時在內存中保存所有對象。在這種情況下,核心數據可能會幫助你很多。

+0

嗨奧萊 謝謝,我一直在尋找這種方式的一些見解: )我的Person對象大約0.1KB一塊。 我開始認爲它是我從中獲得數據的web服務。我一直在測試不同數量的xml,並將其注入到我的腳本中,並且它在模擬器中一直沒有崩潰 我似乎如果使用Instruments運行它,它不會崩潰,但會增長到大約250MB。我相信Nathan正在進行一些工作,Instruments無法找到任何泄漏,並且解析完成的時刻(並且URLConnection和XMLParser已經發布),分配的MB從250變爲1.5。 謝謝:) – RickiG 2009-11-04 15:35:26

+0

我有一個核心數據模型,但真的覺得它瘋了必須使用它來顯示50個搜索結果。 我認爲這個bug埋在其他地方,也許我應該放慢速度,更好地觀察儀器工具。 謝謝 – RickiG 2009-11-04 15:38:32

0

如果您沒有收到內存警告,則可能不是您的應用退出的原因。在Xcode中,轉到組織器,然後選擇設備,然後單擊控制檯選項卡。如果他們的應用程序由於內存原因而被關閉,控制檯日誌中會顯示一條系統消息,說明它由於內存壓力而導致應用程序被終止。

+0

正如我所瞭解的NSXMLParser,'-parse'是一個同步方法,即它不會返回到運行循環,直到解析過程結束。在這種情況下,你不會得到記憶警告,是嗎? – 2009-11-04 01:00:25

+0

這取決於...就我個人而言,我從不在主線程上執行XML解析(主要是爲了避免UI打包),所以主運行循環繼續處理事件就好了。 – 2009-11-04 01:55:50

4

儘管NSXMLParser是一個基於SAX解析器它支持解析輸入流,這意味着你正在解析整個XML字符串保存在內存中。這本身就是一個大問題,但是隨着您開始在Person對象中複製XML中的字符串數據,解析問題變得更加嚴重。

如果你的字符串真的很大,你有第二個問題,一次在內存中有太多解析對象Person

第一個問題可以通過使用Jim Dovey的AQToolkit庫中的AQXMLParser來解決,該庫提供了類似NSXMLParser的API,但支持從磁盤流式傳輸數據。

第二個問題可以使用基於磁盤的持久性技術來解決,比如核心數據,SQLite持久對象,或者甚至只是將Person對象存儲在磁盤上。

+0

感謝Nathan 這是令人難以置信的:)我確信SAX解析器會讀取流而不僅僅是內存中的塊:/我會嘗試將lok導入您推薦的ToolKit中,感謝您清除對NSXMLParser的誤解給我! – RickiG 2009-11-04 15:20:02

+0

我也應該提到你實際上並不需要整個AQToolkit ...只需將iPhoneNonatomic.h,AWXMLParser.h,AWXMLParser.m,AWXMLParserDelegate.h和AWXMLParserDelegate.m放到你的項目中即可。然後,您可以使用「initWithStream:」API而不是NSXMLParser的「initWithData:」API。 – 2009-11-04 23:37:12

+0

他們有ARC源代碼嗎? – 2013-04-16 15:23:04