我已经阅读了核心数据文档中的内存管理部分,但我仍然有点困惑。我的应用程序中有一个上下文,并且我有几件事可以从中获取对象。例如,一些获取结果控制器、详细视图和一些其他获取随机对象的代码。一旦对象被完全释放并且其保留计数为0,核心数据是否会自动释放所有对象信息并故障它们?
我在一些获取的结果控制器中将大量数据拉入我的上下文中,并且我想确保在用户完成滚动并且可能已经深入到另一个视图后,滚动表视图时获取的那些对象是否会被获取被释放并退回商店?
非常感谢,
Mike
Core Data 管理对象生命周期的方式与 Cocoa 其余部分管理对象生命周期的方式相同:只要托管对象上下文存在,托管对象上下文中的 NSManagedObject 实例就会保留在内存中或任何其他物体保留它们的所有权(通过-[NSObject retain]
。默认情况下,NSManagedObjectContext
不保留实例,因此一旦任何其他所有者(即您的NSFetchedResultsController
实例或程序中的其他实例)释放它们。您可以更改托管对象上下文的默认行为以保留实例,但您很少愿意这样做。被管理对象上下文has保留更新的实例直到下次保存。在保存上下文之前,除了对象实例之外,无法保留这些更改。因此,为了最大限度地减少 Core Data 对象的内存使用量,请遵循标准规则:尽快释放它们。如果您发现上下文内存使用量正在增长(使用 Instruments 的 Core Data 工具来跟踪此情况),如果您正在更新实例,请更频繁地保存上下文,从而使它们在上下文中保持活动状态,直到下一次保存,即使您已经这样做了释放了他们。
Using NSFetchedResultsController
让这一切变得更加容易。其实原因是NSFetchedResultsController
存在的根本目的是为了让程序员在低内存环境(如 iPhone)中更容易批量获取。
正如路易斯提到的,NSPersistentStoreCoordinator
维护行缓存以将实例数据缓存在内存中,而当对象故障进入托管对象上下文时不必返回磁盘。然而,这是核心数据实现细节(尽管缓存未命中会影响性能;您可以在 Instruments 中跟踪缓存未命中)。 Core Data 管理缓存,您不必担心它。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)