核心数据内存管理

Mic*_*all 9 iphone memory-management core-data

我已经阅读了核心数据文档中的内存管理部分,我仍然有点困惑.我的应用程序中有一个上下文,我有几个东西可以从中获取对象.例如,一些提取的结果控制器,详细视图和一些其他代码获取随机对象.一旦对象完全释放并且其保留计数为0,核心数据是否会自动释放所有对象信息并对其进行故障排除?

我在我的一些提取的结果控制器中将大量数据放入我的上下文中,并且我想确保在用户完成滚动并且可能已深入到另一个视图之后,滚动tableview时获取的那些对象被释放并故障回到商店?

非常感谢,

麦克风

Bar*_*ark 12

核心数据管理对象生命周期与Cocoa的其余部分管理对象生存期的方式相同:只要托管对象上下文或任何其他对象保留对它们的所有权(通过-[NSObject retain].默认情况下,管理对象上下文中的NSManagedObject实例)保留在内存NSManagedObjectContext中不保留实例,因此只要任何其他所有者(即您的NSFetchedResultsController实例或程序中的其他实例)释放它们就会释放它们.您可以更改托管对象上下文的此默认行为以保留实例,但您很少想要这样做.托管对象上下文必须保留在下次保存之前更新的实例.除了在对象实例中保存这些更改之前无法保存这些更改,直到保存上下文.因此,为了最小化Core Data对象的内存使用,请遵循标准规则:release如果你发现你的上下文内存使用量在增长(使用Instruments的核心数据工具来跟踪它),如果要更新insta,请更频繁地保存上下文 即使你已经释放它们,也要保持它们在上下文中存活直到下一次保存.

使用NSFetchedResultsController使所有这一切变得更容易.实际上,NSFetchedResultsController存在的理由是使程序员更容易在低内存环境(如iPhone)中进行批量读取.

正如路易斯所提到的,NSPersistentStoreCoordinator维护一个行缓存来缓存内存中的实例数据,而不是在对象出现故障进入托管对象上下文时必须返回磁盘.这是一个核心数据实现细节,但是(虽然缓存未命中是性能损失;您可以跟踪仪器中的缓存未命中).核心数据管理缓存,您不必担心它.