Cocoa 核心数据占用了大量内存

Cocoa 核心数据占用了大量内存,cocoa,core-data,Cocoa,Core Data,我有一个数据模型,有点像这个简化图: 这有点奇怪,但其想法是该应用程序将一个人可能拥有的多个帐户/身份管理到一个单一的消息传递系统中。每个帐户都与系统上的一个用户关联,并且每个消息都可能被查看/发送到多个帐户(但它们具有全局唯一的ID,因此具有messageID属性,该属性在导入时用于获取可能已由先前会话下载和导入的消息对象) 该应用程序是从每个帐户的角度使用的——我的意思是,你选择要使用的帐户,然后在窗口中从该帐户的角度查看消息和内容。因此,我将邮件附加到帐户,这样我就可以轻松地通过如下方式

我有一个数据模型,有点像这个简化图:

这有点奇怪,但其想法是该应用程序将一个人可能拥有的多个帐户/身份管理到一个单一的消息传递系统中。每个帐户都与系统上的一个用户关联,并且每个消息都可能被查看/发送到多个帐户(但它们具有全局唯一的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。。等等

我追踪到帐户和消息之间的多对多关系。即使启用了垃圾收集,托管对象仍被帐户的messages关系属性强烈引用。我之所以知道这一点,是因为我在消息实例的finalize中放了一个日志,但从来没有看到它——但是如果我定期重置上下文或在account对象上执行refreshObject:mergeChanges:操作,我会看到finalize消息和内存使用保持相当一致(虽然仍在增长,但考虑到我正在导入内容,这是意料之中的). 问题是,我不能一直重置上下文或account对象,因为这会让观察account对象其他属性的观察者感到混乱


我可能只是建模错误或思考错误,但我反复阅读,将核心数据视为对象图而不是数据库是很重要的。我想我已经在这里做了,但它似乎在制造麻烦。我该怎么办?

使用对象图工具。它会告诉你保持一个物体存活的所有所有权。

你读了吗?

是的。我相信我已经按照指南安排好了。现在,我甚至在另一个线程上使用自己的上下文运行导入批处理,但它仍在不断增长(