我有一个核心数据类 Game,它与另一个类 Player 具有一对多关系。这就是他们的标题的样子
@property (nonatomic, retain) NSSet * players; // In Game.h
@property (nonatomic, retain) Game * game; // In Player.h (the inverse relationship)
当我释放对 Game 类的最后一个外部引用时,没有调用 didTurnIntoFault。现在,我的问题是,这可能是由于上面创建的循环引用造成的(如您所见,这两个属性都是“保留”),还是核心数据管理所有这些,问题出在我的代码中的某个地方。
See 核心数据编程指南:内存管理(打破关系保留周期).
当托管对象之间存在关系时,每个对象都会维护对其相关的一个或多个对象的强引用。在托管内存环境中,这会导致保留周期(请参阅对象所有权和处置)可以防止释放不需要的对象。为了确保打破保留循环,当您完成一个对象时,您可以使用托管对象上下文方法refreshObject:mergeChanges:把它变成一个错误。
您通常使用refreshObject:mergeChanges:
刷新托管对象的属性值。如果mergeChanges
标志是YES
,该方法将对象的属性值与持久存储协调器中可用的对象的属性值合并。如果标志是NO
然而,该方法只是将对象恢复为故障,而不进行合并,从而导致它释放相关的托管对象。这会破坏该托管对象与其保留的其他托管对象之间的保留周期。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)