首页 文章

NSManagedObject的保留周期仍然可能吗?

提问于
浏览
4

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

断开关系强引用循环当您在托管对象之间 Build 关系时,每个对象都会维护对与其相关的对象的强引用 . 这可能会导致强大的参考周期 . 为确保引用周期被破坏,当您完成对象时,可以使用托管对象上下文方法refreshObject:mergeChanges:将其转换为错误 . 您通常使用refreshObject:mergeChanges:刷新托管对象的属性值 . 如果mergeChanges标志为YES,则该方法将对象的属性值与持久性存储协调器中可用对象的属性值合并 . 但是,如果该标志为NO,则该方法只是将对象转换回故障而不合并,这会导致它破坏对相关管理对象的强引用 . 这打破了该托管对象与其他托管对象之间的强引用循环 . 请注意,当然,在可以取消分配托管对象之前,必须没有对它的强引用,包括来自Core Data之外的引用 . 另请参阅更改和撤消管理 .

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

2 回答

  • 1

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

    注意:该文档是旧的,我建议阅读更新的指南 .

  • 1

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

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

相关问题