1

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

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

如果我限制 xml 中的人员数量,应用程序就可以正常工作,我无法使用 Instruments 找到任何内存泄漏。我认为我根本无法在一个数组中保存 50+ 个 Person 对象……看起来有点苛刻,但我对 iPhone 没有太多的记忆经验,所以这只是一个猜测。

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

保留这些 Person 对象的好策略是什么?还是我错过了巨大的内存泄漏,因为 iPhone 应该能够处理的远不止这些?

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

谢谢!

4

4 回答 4

4

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

Person如果你的字符串真的很大,你就会遇到第二个问题,即一次在内存中有太多已解析的对象。

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

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

于 2009-11-04T13:29:41.523 回答
1

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

于 2009-11-04T00:49:16.840 回答
0

如果您没有收到内存警告,则可能不是您的应用退出的原因。在 Xcode 中,转到管理器,选择设备,然后单击控制台选项卡。如果他们的应用程序因内存原因被关闭,控制台日志中将显示一条系统消息,说明由于内存压力而正在终止应用程序。

于 2009-11-04T00:55:30.777 回答
0

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

于 2013-07-16T07:01:51.183 回答