调试NSObjectInaccessibleException - ID为0x123456789的NSManagedObject已失效

Rog*_*Rog 11 core-data

我有一个我正在努力追查的错误.我相信正在发生的事情是我从底层数据库中删除一个对象,而另一个托管对象上下文(在另一个线程中)有一个错误,并在尝试完成故障时获得'NSObjectInaccessibleException'.

场景是我有一个视图通过一个上下文同时在后台访问数据,另一个威胁是从商店中清除过时的记录.后台线程应该只清除视图不需要的对象 - 显然情况并非如此,但我无法准确地追踪到底发生了什么.当我看到缺陷时,为时已晚,这是一个相对罕见的缺陷,主要发生在现场.

因此我的问题是:在调试CoreData时是否有任何技巧缺失 - 我可以在另一个上下文中跟踪对象的生命周期吗?即,当我删除我的对象时,有一种简单的方法可以查看是否有任何其他上下文引用了同一个对象?使用它,我可以构建一些测试代码来检查我的逻辑并找到错误.

Jas*_*son 7

我之前遇到过这个错误,罪魁祸首是我正在清理(完成发布)我的上下文,然后尝试访问由该上下文管理的对象(以前).

就我而言,上下文是一个"刮擦"上下文,在视图关闭时会消失.但是,我有一个后台工作,该视图产生了想要更新对象的视图.

我最终为[managedObject isFault]为true时返回nil的托管对象创建了一个访问器.然后在我的代码中,我检查了访问器选择器的值,以确保我有一个有效的对象可以使用(例如当我的后台作业最终完成其工作时).

我对Core Data很陌生,所以可能有更好/更聪明的方法来做到这一点,但我认为它解决了我的问题.


Rog*_*Rog 1

解决方案是清理和这个 mapkit bug的组合。在我释放 NSManagedObjectContext 后,地图视图保留了它的委托。Mapkit 向委托询问注释的坐标,而我的委托对象尝试查询已发布上下文中的对象(类似于 Jason 的问题)。

修复方法如 Jake 的博客文章中所述 - 当您完成地图视图时将委托设置为 nil。