【问题标题】:Core Data refuses to clear external data references from memoryCore Data 拒绝从内存中清除外部数据引用
【发布时间】:2015-03-13 11:53:01
【问题描述】:

我正在使用背景为NSManagedObjectContext 的后台线程上将大量数据加载到Core Data 中。我经常在保存后重置此背景上下文,以便从内存中清除对象图。一旦操作完成,上下文也会被释放。

问题在于,无论我做什么,Core Data 都拒绝释放存储为外部引用的大块数据。我已经在Allocations 仪器中验证了这一点。一旦应用程序重新启动,内存占用将保持极低,因为这些外部引用只有在用户访问时才会出现故障。我需要能够在初始下载和导入后从内存中删除这些BLOBS,因为它们共同占用了太多空间。平均而言,它们只是 html,所以大多数是 less than 1MB

我已经尝试过refreshObject:mergeChanges:,几乎所有东西都将标志设置为 NO。我什至也尝试过重置我的主要NSManagedObjectContext。我有很多autorelease pools,没有内存泄漏,也没有启用僵尸。最初创建外部引用时,如何减少我的 Core Data 内存占用?

我查看了 Apple 的所有文档,但找不到有关外部 BLOBS 生命周期的任何信息。我也在这个网站上搜索了许多类似的问题没有解决方案:Core Data Import - Not releasing memory

应用程序第一次重新启动后一切正常,但我也需要第一次运行稳定。还有其他人能够成功地使用 Core Data 对 NSData BLOBS 进行故障排除吗?

【问题讨论】:

  • 也许一个代码示例展示您如何存储和使用这些 BLOB 会有所帮助。
  • 这是特定于 Core Data 的。创建一个带有外部 NSData 属性的 NSManagedObject。排队一个 NSMangedObjectContext 并在这个属性上创建许多带有虚拟数据的对象。在应用程序重新启动之前,您将无法清除此内存,即使这些对象出现故障或上下文已重置。
  • 我记得我的应用程序中遇到了类似的问题。我将存储 BLOB 的属性替换为与单独实体的关系,并将 BLOB 作为其唯一属性。然后,当不再需要此实体的实例时,我会调用 refreshObjects:。本指南推荐这种方法:developer.apple.com/library/ios/documentation/Cocoa/Conceptual/…
  • 我已经完成了这种精确的方法。我的问题是,在 ios8 上,这些对象的故障不会从内存中清除它们。

标签: ios core-data memory-management


【解决方案1】:

我假设“从内存中清除”是指“导致对象被释放”而不是“将地址空间返回给系统”。前者在你的控制之下。后者不是。

如果您可以在 Allocations 工具中看到分配,您是否打开了对引用计数事件的跟踪并平衡了保留和释放?应该有一个指示性的额外保留(或更多)。

如果你能提供一个简单的示例项目,就会更容易弄清楚发生了什么。

【讨论】:

    猜你喜欢
    • 2015-09-01
    • 2011-07-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-24
    • 1970-01-01
    • 2012-01-19
    • 2012-03-31
    • 1970-01-01
    相关资源
    最近更新 更多