【问题标题】:Core Data And Retain Cycles核心数据和保留周期
【发布时间】:2009-11-24 13:12:24
【问题描述】:

我有一个核心数据类 Game,它与另一个类 Player 有一对多关系。这就是他们的标题的样子

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

当我释放对 Game 类的最后一个外部引用时,没有调用 didTurnIntoFault。现在,我的问题是,这可能是由于上面创建的循环引用(如您所见,两个属性都是“保留”),还是核心数据管理所有这些,问题出在我的代码中。

【问题讨论】:

    标签: core-data


    【解决方案1】:

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

    当您在托管对象之间建立关系时,每个对象都维护对与其相关的一个或多个对象的强引用。在托管内存环境中,这会导致保留循环(请参阅Object Ownership and Disposal),这可能会阻止释放不需要的对象。为确保保留周期被打破,当您完成一个对象时,您可以使用托管对象上下文方法refreshObject:mergeChanges: 将其变为故障。

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

    【讨论】:

    • 我可以发誓我是 RTFM,但我想念我 :) 无论如何谢谢!
    • 我可以补充一点,您必须递归地执行此操作,即中断托管对象的循环不会自动中断子对象之间可能存在的任何循环
    猜你喜欢
    • 2011-03-08
    • 2013-04-06
    • 2011-04-28
    • 2019-06-22
    • 2014-07-30
    • 1970-01-01
    • 1970-01-01
    • 2011-12-07
    相关资源
    最近更新 更多