【问题标题】:CoreData memory usage: differences between iOS 5 and iOS 4.3?CoreData 内存使用情况:iOS 5 和 iOS 4.3 之间的区别?
【发布时间】:2011-12-05 18:53:51
【问题描述】:

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

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

  • 高级类别(二进制数据有限的实体
  • 每个类别都有约 10 个子类别(二进制数据有限的实体
  • 每个子类别有大约 10 个产品(同样,有限的二进制数据
  • 每个产品都有约 10 张详细图片(数据量更大:约 40-70K)

每个项目的详细项目(包括图片)被释放后,我做一个

[NSManagedObjectContext refreshObject:item mergeChanges:NO];

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

在 iOS 5+ 上一切正常,但在 iOS 4.3 上,我遇到了很多错误。

有时,错误是:

由于未捕获的异常而终止应用程序 'NSObjectInaccessibleException',原因:'NSManagedObject 与 编号:0xbb70480 已失效。'

其他时候,应用程序因“处理程序引发异常”而被终止,并且没有详细说明出了什么问题。

我的问题是:

  • 知道为什么该行为与 iOS 5 和 iOS 4.3 不同吗?
  • 有什么建议可以减少 CoreData 使用的内存吗? (除了释放获取控制器和释放不再使用的上下文)

【问题讨论】:

    标签: ios core-data ios4 ios5


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 谢谢@XJones。 “配置所有获取请求以获取除图像数据之外的所有属性,以便在需要时图像出现故障。您还需要确保在不需要时将图像数据转换回故障。”:是否有怎么做?
    • 没问题。查看NSFetchRequestpropertiesToFetch 属性。
    • 非常感谢,我会试试的。我不知道这个功能。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-28
    • 2018-03-13
    • 1970-01-01
    • 2014-04-08
    • 1970-01-01
    • 2014-04-25
    • 1970-01-01
    相关资源
    最近更新 更多