CoreData Object 变成 data: <fault> 的另一种方式

近来一直与 CoreData 打交道,这是一个架构庞大、学习曲线比较陡峭的 iOS 组件,每次遇到问题都会对其有新的认识。

这次就只讲一点,关于错误认知 Object(NSManagedObject)与 Context (NSManagedContext)的引用关系而导致的 Fault 问题。

用过 CoreData 的都应该对其基本使用有个最直接的了解,那就是:Object 都是放在 Context 里的,同时 Object 也会有一个 「managedObjectContext」的方法,可以得到它所在的 Context。

刚开始,我很天然地以为,Context 强引用了 Object,Object 反过来也是引用了 Context。事实上不是如此,Object 的 「managedObjectContext」是 method,而不是 property,这是没有强引用关系的。

假如你从 CoreData Stack 新建了一个 Context,然后从这个 Context 里取出来一个 Object,并且把这个 Object 指派给一个 ViewController,最后在这个 ViewController 里进行一些任务,你很快就会发现,Object 变成 fault 而无法使用了。

这是因为如果不同样强引用这个 Context,在它被释放掉以后,Object 会因为没有这个 Context 而导致「Fault cannot be fulfilled」进而无法使用。

关于「Fault cannot be fulfilled」,在 Apple 官方文档「Troubleshooting Core Data」还有一个例子,与我遇到的这个不太一样。它所描述的情况是:从 Context 里删除了 Object 以后,实质内容已经被删除,但 Object 因为在内存管理周期内还没有被释放掉,只是变成了一个 Fault,这时如果再访问这个 Object,就会得到「Fault cannot be fulfilled」的错误。

再回到我遇到的那个问题,通常在一个不是特别复杂的基于 CoreData 的程序当中,我们不会用到很多个 Context,而且大家的 CoreData Stack 都是在 AppDelegate 级别强引用了 Context,尤其不会用到临时新建的 Context 而忘记强引用它,因而这个问题也太不常见。

总之,看文档的时候一定要注意区分 method 和 property,即使使用同样的语法+返回的是同样的东西,也不能觉得它们是一回事。从这里上来看,严格的使用 [object method] 和 object.property 这个语法还是有必要的。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值