NSManagedObject的保留周期是否仍然可能?

时间:2015-07-13 18:39:11

标签: ios core-data

根据文档,我们有一些麻烦:内存泄漏。 https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/CoreData/Articles/cdMemory.html

  

打破关系强参考周期

     

当您在托管对象,每个对象之间建立关系时   保持对它所对象或对象的强引用   有关。这可能会导致强大的参考周期。为了确保   当你完成一个物体时,参考周期就会被打破   可以使用托管对象上下文方法refreshObject:mergeChanges:   把它变成一个错误。

     

您通常使用refreshObject:mergeChanges:刷新托管   对象的属性值。如果mergeChanges标志为YES,则为方法   将对象的属性值与可用对象的属性值合并   在持久性存储协调器中。但是,如果标志为NO,则   方法只是将一个对象转换回一个没有合并的错误,这就是   导致它破坏对相关托管对象的强引用。这个   打破了该托管对象与该托管对象之间的强引用循环   其他管理对象。

     

注意,当然,在可以在那里取消分配托管对象之前   必须没有强烈的参考,包括来自Core之外   数据。另请参阅更改和撤消管理。

但是。没有任何Apple代码示例可以解决此问题。 我已经检查过TopSongs,iPhoneCoreDataRecipes,CoreDataBooks,ThreadedCoreData示例项目,但是他们都没有关注这个问题。是否意味着对象关系现在很短暂?

2 个答案:

答案 0 :(得分:1)

对象关系并不弱。但是,我们现在正在使用ARC,它知道如何正确处理这些参考周期。

注意:该文档很旧,我建议您阅读更新的指南。

答案 1 :(得分:1)

关系不是weak,并且新文档中没有任何内容表明核心数据在保留周期中是安全的。事实上,"Turning Object into Faults"下的第一段专门提到了强参考周期:

将已实现的对象转换为错误可能有助于修剪对象图,以及确保属性值是最新的。将托管对象转换为故障会释放不必要的内存,将其内存中的属性值设置为nil,并中断对相关对象的强引用。 (请参阅减少内存开销并确保数据是最新的)