我有一个类似于这个简化图的数据模型:
alt text http://dl.dropbox.com/u/545670/thedatamodel.png
这有点奇怪,但想法是应用程序管理一个人可能拥有的多个帐户/身份到一个邮件系统中。每个帐户都与系统上的一个用户相关联,并且每个消息都可能被看到/发送到多个帐户(但是它们具有全局唯一ID,因此在导入时使用messageID属性来获取可能已经存在的消息对象由之前的会议下载和导入。)
该应用程序是从每个帐户的角度使用 - 我的意思是您选择要使用的帐户,然后您在窗口中查看该帐户的观点中的消息和内容。所以我将消息附加到帐户,以便我可以使用这样的提取轻松获取应显示的消息:
fetch.fetchPredicate = [NSPredicate predicateWithFormat:@"%@ IN accounts", theAccount];
fetch.sortDescriptors = [NSArray arrayWithObject:[[NSSortDescriptor alloc] initWithKey:@"date" ascending:NO]];
fetch.fetchLimit = 20;
这似乎是正确的设置方式,因为消息在帐户之间共享,如果消息被标记为一个消息,我希望它被另一个读取,等等。
无论如何,在所有这些设置之后,最大的问题是内存使用似乎有点疯狂。当我设置一个测试用例,它将数百条消息导入系统,并定期重新获取(使用上面提到的提取)并在列表中显示它们(只有最后20个被列表引用),内存就变得疯狂了。 60MB .. 70MB ...... 100MB ......等。
我将其追溯到帐户和消息之间的多对多关系。即使启用了垃圾收集,托管对象仍然被帐户的消息关系属性强烈引用。我知道这是因为我在Message实例的finalize中放了一个日志而且从未看到它 - 但是如果我定期重置上下文或者在account对象上执行refreshObject:mergeChanges:我看到finalize消息和内存使用保持相当一致(虽然仍然有所增长,但考虑到我正在进口东西,这是可以预期的)。问题是我无法一直重置上下文或帐户对象,因为这实际上会扰乱观察帐户对象的其他属性的观察者!
我可能只是对这个错误进行建模或者考虑错误,但我一直在阅读,认为核心数据是对象图而不是数据库是很重要的。我想我已经在这里完成了,但它似乎造成了麻烦。我该怎么办?
答案 0 :(得分:2)
使用Object Graph工具。它会告诉你保持对象存活的所有权利。
答案 1 :(得分:1)