我的数据核心存在内存问题。在视图控制器中,我从NSManagedObject加载图像(数据),然后显示它,然后转到下一页加载另一个图像,依此类推。 问题是我无法释放数据,在分配工具中保存在CFDATA(商店)中。以下是代码的一部分:
ComicImage *cimg = [page getImageData];
NSData *data=cimg.imageData ;
ComicImage是一个NSManagedObject,getImageData返回带有要显示的图像的ComicImage。
释放数据会删除核心数据中的图像,我无法再次加载(崩溃)。我尝试过refreshObject:mergeChanges,但没有结果; [context reset]崩溃了应用程序。 任何的想法? 感谢。
答案 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。