避免在NSManagedObjectContext中建立注册的对象内存泄漏

问题描述

|| 我有一个占用大量内存的iOS应用,并且正在努力确保内存使用量不会随着时间的推移而增加。我的应用程序具有一个“ main”上下文,该上下文在该应用程序的生命周期内有效,而其他较小的上下文则偶尔会被派生用于后台任务。 我注意到的一件事是,NSManagedobjects似乎长期在主要上下文中保持注册状态,真正回收与从DB中拉出对象相关的所有内存的唯一方法调用“ 0”。 当然,由于最近关闭的列表视图中的所有已注册对象均已从内存中正确弹出,因此这会导致内存使用率大幅下降,但是这很烦人,因为您刚刚使在该上下文中注册的每个对象都无效,您仍然拥有引用到(即仍然打开的视图所引用的对象),现在您需要从数据库中重新获取所有这些对象,以避免访问无效对象的异常。 这是从NSManagedobjectContext中清除已注册对象集的唯一方法,还是有更好的方法可以成功弹出您不再引用的所有已注册对象,但不会使所有仍然存在的NSManagedobjects无效?     

解决方法

        
NSManagedObjectContext
有一个内部行高速缓存,清除此错误的唯一方法是重置上下文。如果您实际上遇到了内存问题,那么可能有一些帮助: 受管对象保留其相关对象。如果您拥有被其他托管对象
B
中的某个关系引用的托管对象
A
,那么即使释放了对其的所有引用,对象
A
也会保留在内存中。在对象“ 3”被释放或重新故障之前,它实际上不会被释放,因为它仍将被对象“ 3”保留。 解决此问题(以及其他内存问题)的一种方法是,在MOC上为您当前不使用的对象调用ѭ7,第二个参数设置为
NO
。这重新破坏了对象,即,使对象返回到初始的“故障”状态,从而卸载了其属性值和关系。对于之前的
A
B
,重新设置ѭ3re将释放与release2ѭ的关系。请记住,这将丢失ѭ3上所有未保存的更改,因此请确保在必要时先保存。 如果您的托管对象包含任何类型的大型二进制数据,请尝试将该数据移至单独的实体中或从核心数据中移出,以避免在不需要时将其加载到内存中。 对于核心数据内存管理,MOC上的“ 14”基本上是核选项。它非常有效,但是正如您所发现的那样,它非常危险。除非您尚未使用从MOC加载的任何对象,否则最好避免这样做。