CoreData内存使用情况:iOS 5和iOS 4.3之间的差异?

时间:2011-12-05 18:53:51

标签: ios core-data ios4 ios5

我的通用iOS应用程序存在内存问题:CoreData使用了太多内存(> 30 Mo)。因此,我尽我所能减少使用的内存量。

基本上我的CoreData模型是基本目录模型:

  • 高级别类别(二进制数据有限的实体<10K)
  • 每个类别具有~10个子类别(具有有限二进制数据的实体<10K)
  • 每个子类别具有~10个产品(再次,有限的二进制数据&lt; 10K)
  • 每件产品有~10张详细图片(数据量较大:~40-70K)

在每个项目的详细项目(包括图片)被取消分配后,我做了

  

[NSManagedObjectContext refreshObject:item mergeChanges:NO];

调用以减少内存中的图形(为了跳过图片)

iOS 5+的功能非常好,但是对于iOS 4.3,我会遇到很多错误。

有时,错误是:

  

由于未捕获的异常而终止应用   'NSObjectInaccessibleException',原因:'NSManagedObject with   ID:0xbb70480      已失效。'

其他时候,应用程序被“处理程序抛出异常”所杀死,并且没有关于出错的详细信息。

我的问题是:

  • 知道为什么行为与iOS 5和iOS 4.3不同?
  • 关于我可以做什么的任何建议减少CoreData使用的内存? (除了发布获取控制器和释放不再使用的上下文之外)

1 个答案:

答案 0 :(得分:3)

很难说在不同的iOS版本中你的模型的内存使用量的具体差异。根据我的经验,将图像存储在核心数据存储中并不是特别有效。通常,只在需要时才需要内存中的图像数据。您的每个类别都有大约4-7MB的图像数据,因此在遇到问题之前不会占用太多类别。我在我的应用程序中所做的是将图像数据存储在磁盘上并将文件名存储在商店中。图像仅在需要显示时加载,并在不再需要时释放。这样可以使商店变小,并且提取速度很快。

如果您想将图像数据保存在商店中,则应尽可能优化。配置所有获取请求以获取除图像数据之外的所有属性,以便在需要时图像出现故障。您还需要确保在不需要时将图像数据转换回故障。

编辑:关于为什么在核心数据中存储图像数据不好的更多信息

使用核心数据存储图像数据的另一个问题是加载和保存数据,即使只在需要时完成,也需要花费大量的时间,并在加载时阻塞主线程。无论您在何处存储图像数据,都希望从后台加载图像数据。如果使用文件存储,这很简单。如果使用核心数据,则实现创建新上下文的背景图像加载/保存逻辑,加载/保存图像数据。加载时需要将数据传递给主线程,以便创建/显示UIImage。