【发布时间】: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