NSXMLParser适用于大型xml的iPhone内存策略

时间:2009-11-03 22:36:52

标签: iphone memory-leaks nsmutablearray nsxmlparser

我使用NSXMLParser构建解析算法。 我怀疑将内存使用量保持在最低限度的最佳策略是什么。

我有一个valueObject(例如“Person”)这个对象有30个NSString属性,在解析xml时我会不断地分配并释放一个临时的Person对象,因为遍历了节点。 我检查了这个,并且在任何时候只有一个这样的Person对象被实例化。 遍历一个节点并且Person是“build”时,我将Person传递给NSMutableArray并释放此Person。那里似乎没有问题。 (我需要一个tableView的数组)。 当我到达数组中的50多个Person对象时,我的应用程序就退出了,didReceiveMemoryWarning没有被调用,没有其他警告,没有parseErrorOccurred,什么都没有?

如果我限制xml中的人数应用程序就可以了,我还没有找到任何内存泄漏的仪器。 我认为我根本不能在阵列中容纳50多个Person对象......看起来有点刺耳,但我对iPhone没有太多的内存体验,所以这只是猜测。

xml是用户可能只需要几个的搜索结果,因此将它们保存到我的核心模型以保持它们显示似乎有点疯狂。

保持这些Person对象的好策略是什么?或者我错过了一个巨大的内存泄漏,因为iPhone应该能够处理更多这个?

希望一些有经验的开发人员可以指出我正确的方向:)

谢谢!

4 个答案:

答案 0 :(得分:4)

尽管NSXMLParser是基于SAX的解析器,但 不支持 支持解析输入流,这意味着您要解析的整个XML字符串都会被保留在记忆中。这本身就是一个大问题,但是当您开始从Person对象中的XML复制字符串数据时,解析问题会变得更糟。

如果你的字符串非常大,那么你第二个问题就是一次在内存中有太多解析的Person个对象。

第一个问题可以通过使用Jim Dovey的AQToolkit库中的AQXMLParser来解决,该库提供类似NSXMLParser的API,但支持从磁盘传输数据。

第二个问题可以使用基于磁盘的持久性技术来解决,比如Core Data,SQLite Persistent Objects,甚至只是自己将Person对象存储在磁盘上。

答案 1 :(得分:1)

这些琴弦有多长?通常,在iPhone 3G和旧型号上,您的应用程序应至少有大约20 MB的可用内存(3G上更多)。当然,这不是绝对的规则,而是一个不错的经验法则。用50个对象占用这么多内存意味着每个Person对象大约400-500 KB。这是在球场吗?如果是这样,您可能需要一种内存管理策略,该策略不会同时将所有对象保留在内存中。在这种情况下,核心数据可能对您有很大的帮助。

答案 2 :(得分:0)

如果您没有收到内存警告,则可能不是您的应用退出的原因。在Xcode中,转到组织者,选择设备,然后单击控制台选项卡。如果他们的app由于内存原因而被关闭,控制台日志中会有一条系统消息说由于内存压力而导致应用程序被杀。

答案 3 :(得分:0)

答案是切断传入的流,我前一段时间写了一篇关于它的帖子: https://lukassen.wordpress.com/2010/01/15/feeding-nsxmlparser-a-stream-of-xml/