使用核心数据发布数据(CFDATA继续增长)

时间:2011-04-23 10:17:13

标签: core-data memory-management allocation nsmanagedobject

我的数据核心存在内存问题。在视图控制器中,我从NSManagedObject加载图像(数据),然后显示它,然后转到下一页加载另一个图像,依此类推。 问题是我无法释放数据,在分配工具中保存在CFDATA(商店)中。以下是代码的一部分:

        ComicImage *cimg = [page getImageData];


        NSData *data=cimg.imageData ;

ComicImage是一个NSManagedObject,getImageData返回带有要显示的图像的ComicImage。

释放数据会删除核心数据中的图像,我无法再次加载(崩溃)。我尝试过refreshObject:mergeChanges,但没有结果; [context reset]崩溃了应用程序。 任何的想法? 感谢。

3 个答案:

答案 0 :(得分:3)

如果在托管对象的属性中使用UIImage / NSImage来保存图像,那么图像的内存管理就无法实现,因为只要托管对象处于活动状态,图像类就会将图像保留在内存中记忆。

处理大图像的首选方法是将它们存储在外部文件中,并在Core Data中记录文件的路径。这样您就可以根据需要加载和卸载图像。

答案 1 :(得分:2)

我有类似的问题并设法解决它。

即使在释放NSManagedObjects之后,每当我对NSManagedObjectContext执行save操作时,Allocations工具都会显示'CFData(store)'持久存储在内存中。加载其他NSManagedObjects时,'CFData(store)'的大小会增加。

在我的NSManagedObjectContext上调用reset解决了这个问题,我在发布当前的NSManagedObjects后执行此操作,并且在保存操作之后,'CFData(store)'很快从内存中消失。

此外,您可以在NSManagedObject中管理自己的属性。您可以覆盖didTurnIntoFault并在那里发布您的属性。 willTurnIntoFault也是一种替代方案,不应使用dealloc

答案 2 :(得分:0)

您说您转到下一个“页面”以打开新图像。如果您使用的是导航控制器,则会保留之前的页面直到弹出。我建议不要在这种情况下使用UINavigationController。