2013-11-01 38 views
1

例如,我使用带输入流的NSXMLParser。当解析器加载xml节点时,应用程序根据此节点创建NSManagedObject。如果创建了管理对象的计数器(简单NSInteger的财产)超过50个,应用程序保存管理对象范围内,则取全部聚集对象数组并refreshObject:OBJ mergeChanges:NO(有对象转向故障) 满载后到数据库应用程序做同样的事情发生错误,然后重置存储在属性中的上下文并使其无效并将所有引用清除为托管对象。结果:50000个对象被保存,但内存部分释放,没有完全释放(剩下约20兆字节)。 导入到coredata在后台线程做@ autorelease的很多。 泄漏工具未显示泄漏。我想不通为什么内存后没有释放操作泄漏工具没有发现泄漏,但内存不释放

回答

1

泄漏不是内存增长的唯一原因,也存在被遗弃的内存。这意味着你仍然用指针引用和对象,但是你不再使用。在这里找到它们是help
还有一件事你应该检查:autoreleased对象。这些类型的对象被引用到池中。游泳池保留它们直到耗尽。
由于您正在进行解析,所以很可能您正在创建大量自动释放对象,这些对象将在未来一段时间内(可能在下一次运行循环中)释放,但您可以通过创建你自己的游泳池。例如,您可以在解析开始之前启动您的池,并在结束后立即关闭它。 Here是关于如何使用它们的更多信息。

+0

另一个导入到数据库的线程被autorelease池覆盖。然后我在苹果的文章中推荐标记世代。有些代人认为我主线程的主要(),并分析后说“100%”(这是什么意思?)。但它只有一次。在其他时代,只包含libsystem_c.dylib调用 – Arsynth

+1

由于您正在辅助线程上执行一些操作,您确定没有进行保留循环吗? – Andrea

+0

在“泄漏工具”可以发现泄漏的情况下,它不是保修吗?所以我在全局队列中使用dispatch_async。这是个坏主意?在相同的分离线程中创建,编辑和销毁的托管上下文 – Arsynth

0

可能有很多原因,其中许多人可能与你的代码做。还有其他一些可能性。你可以启用僵尸,这会阻止内存被释放。另外,CoreData也根据需要保留对象。

+0

僵尸已禁用,我检查过它。 coreData是否保留对象而不管我的代码? – Arsynth