我仍然在学习iOS开发和使用Core Data,并且刚刚遇到了保留周期 .
通过阅读“核心数据编程指南”,我的理解是,在完成关系之后,使用托管对象上下文方法 refreshObject:mergeChanges
来确保保留周期被破坏 .
因此,假设我在部门与其员工之间存在多对多关系,并且在我的代码中,我从部门访问员工关系,这是否意味着我现在需要遍历每个员工对象并调用 refreshObject:mergeChanges
方法?在代码中,这将是
for (Employee *anEmployee in department.employees) {
//some code that accesses an employee's properties
[context refreshObject:enEmployee mergeChanges:NO];
}
似乎如果我不这样做,我访问的每个员工对象现在都包含对部门的引用,我将最终得到保留周期 .
我的理解在这里是否正确?在处理Core Data中的多对关系时,这是一种标准方法吗?谢谢 .
3 回答
您可以在Breaking Relationship Retain Cycles查看,保留周期是必要的,以防止不需要的对象的重新分配 . 这意味着您在使用对象时保留对象 .
如果您已完成该对象并且想要将其变为故障,则应使用
refreshObject:mergeChanges
,以便在可能的情况下处置内存 . 它不一定会在关系的另一端释放对象,它只会为核心数据设置一个标志,如果需要,该对象可以变成故障 .我已经编写了几个辅助方法(见下文),通过使用Entity模型的内省来打破整个对象图的保留循环 . 您可以在收到内存警告通知后使用它,以释放通过该特定对象可访问的核心数据模型部分所拥有的任何内存 .
我的经验是,只有部门实体的重新断层足以打破保留周期 . 分析内存清楚地显示所有相关员工随后被释放,除非他们通过您的代码保留在其他地方 .