核心数据和保留周期

时间:2009-11-24 13:12:24

标签: core-data

我有一个核心数据类游戏,它与另一个类玩家有很多关系。这就是他们的标题看起来像

@property (nonatomic, retain) NSSet * players; // In Game.h
@property (nonatomic, retain) Game * game; // In Player.h (the inverse relationship)

当我向Game类发布最后一个外部引用时,不会调用didTurnIntoFault。现在,我的问题是,这可能是由于上面创建的循环引用(正如您所看到的,两个属性都是'保留'),或者核心数据是否管理了所有这些并且问题出现在我的代码中。

1 个答案:

答案 0 :(得分:4)

请参阅Core Data Programming Guide: Memory Management (Breaking Relationship Retain Cycles)

  

当您在托管对象之间建立关系时,每个对象都会对与其相关的一个或多个对象保持强引用。在托管内存环境中,这会导致保留周期(请参阅Object Ownership and Disposal),以防止不需要的对象的重新分配。为确保保留周期被破坏,当您完成对象时,可以使用托管对象上下文方法refreshObject:mergeChanges:将其转换为错误。

     

通常使用refreshObject:mergeChanges:刷新托管对象的属性值。如果mergeChanges标志为YES,则该方法将对象的属性值与持久性存储协调器中可用对象的属性值合并。但是,如果标志为NO,则该方法只是将对象转换回故障而不合并,这会导致它释放相关的管理对象。这会破坏该托管对象与其保留的其他托管对象之间的保留周期。