@quote:

近来一直与 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 这个语法还是有必要的。

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

PS: 我查阅了API文档,上面有句话一直不懂:

- (BOOL)isFault

Description

Returns a Boolean value that indicates whether the receiver is a fault.

Knowing whether an object is a fault is useful in many situations when computations are optional. It can also be used to avoid growing the object graph unnecessarily (which may improve performance as it can avoid time-consuming fetches from data
stores).

If this method returns NO, then the receiver's data must be in memory. However, if this method returns
YES, it does not imply that the data is not in memory. The data may be in memory, or it may not, depending on many factors influencing caching

If the receiver is a fault, calling this method does not cause it to fire.  ////这句话真心不明确?还请大虾赐教@@ 

iOS 开发系列:CoreData Object 变成 Fault 的一种方式的更多相关文章

  1. iOS 开发之 - 关闭键盘 退出键盘 的5种方式

    iOS 开发之 - 关闭键盘 退出键盘 的5种方式   1.点击编辑区以外的地方(UIView) 2.点击编辑区域以外的地方(UIControl) 3.使用制作收起键盘的按钮 4.使用判断输入字元 5 ...

  2. 【iOS开发-图层】自己定义图层的两种方式

    想要自己定义图层,仅仅须要构建一个类继承CALayer方法 假设让自己定义图层初始化上面就有画好的图形.有两种办法 重写drawInContext方法 自己定义的图层以下的方法.然后必须自己定义的图层 ...

  3. iOS开发系列--数据存取

    概览 在iOS开发中数据存储的方式可以归纳为两类:一类是存储为文件,另一类是存储到数据库.例如前面IOS开发系列-Objective-C之Foundation框架的文章中提到归档.plist文件存储, ...

  4. 【转】iOS开发系列--数据存取

    原文: http://www.cnblogs.com/kenshincui/p/4077833.html#SQLite 概览 在iOS开发中数据存储的方式可以归纳为两类:一类是存储为文件,另一类是存储 ...

  5. iOS开发系列--Swift进阶

    概述 上一篇文章<iOS开发系列--Swift语言>中对Swift的语法特点以及它和C.ObjC等其他语言的用法区别进行了介绍.当然,这只是Swift的入门基础,但是仅仅了解这些对于使用S ...

  6. iOS开发系列--通知与消息机制

    概述 在多数移动应用中任何时候都只能有一个应用程序处于活跃状态,如果其他应用此刻发生了一些用户感兴趣的那么通过通知机制就可以告诉用户此时发生的事情.iOS中通知机制又叫消息机制,其包括两类:一类是本地 ...

  7. iOS开发系列--并行开发其实很容易

    --多线程开发 概览 大家都知道,在开发过程中应该尽可能减少用户等待时间,让程序尽可能快的完成运算.可是无论是哪种语言开发的程序最终往往转换成汇编语言进而解释成机器码来执行.但是机器码是按顺序执行的, ...

  8. iOS开发系列--通知与消息机制--转

    来自:http://www.cocoachina.com/ios/20150318/11364.html 概述 在多数移动应用中任何时候都只能有一个应用程序处于活跃状态,如果其他应用此刻发生了一些用户 ...

  9. iOS开发系列--Swift语言

    概述 Swift是苹果2014年推出的全新的编程语言,它继承了C语言.ObjC的特性,且克服了C语言的兼容性问题.Swift发展过程中不仅保留了ObjC很多语法特性,它也借鉴了多种现代化语言的特点,在 ...

随机推荐

  1. django1.8中如何显示图片,应用css样式,javascript事件

    在django中将图片.javascript.css称为静态文件.如何将这些静态文件显示在django中呢?近期做一个项目,一直困扰着我,后来查找各种资源,终于在官方文档中找到. 官方文档链接 在se ...

  2. 关于locate这个NB命令我不得不深入的学习

    先看看locate的安装包和生成的文件: [root@NB mlocate]# which locate /usr/bin/locate [root@NB mlocate]# rpm -qf /usr ...

  3. JS页面跳转并及时刷新

    "<script type='text/javascript'>alert('操作成功!');window.history.go(-2);window.close();</ ...

  4. C++面向对象程序设计的一些知识点(3)

    摘要:多态性提供一组统一的调用接口函数,依据这些条用接口函数具体对象的不同,同一名字的函数会有不同的行为. 1.重载与隐藏 (1).对同一作用域中的同名函数,如果它们的函数特征标不同,那么它们就形成一 ...

  5. eclipse workspace 优化

    换了新的工作空间,当然在开发之前先优化该工作空间啦! 1.换编码 2.优化加载项 去除不用的 3.优化代码检查   不用的去掉 4.禁止更新功能 5.更换字体其他个人偏好设置   微软雅黑 字体5号 ...

  6. 基于jQuery左右滑动切换图片代码

    分享一款基于jQuery左右滑动切换图片代码.这是一款基于jQuery实现的左右滑动切换焦点图代码.效果图如下: 在线预览   源码下载 实现的代码: <div class="v_ou ...

  7. html5和css3打造一款创意404页面

    之前和网友分享一款HTML5可爱的404页面动画 很逗的机器人.今天要爱编程小编要再给大家带来一款html5和css3打造的创意404页面.一起看下效果图吧: 在线预览   源码下载 实现的代码. h ...

  8. wp中的动画

    动画目标:必须是依赖属性.可以用于Double,Color,Point,Object类型.对应的动画类后面加Animation,下面代码演示旋转360°. <Button Content=&qu ...

  9. dubbox2.8.4例子教程二

    简介 上篇博客写了个dubbox生产者,也用HttpClient代码测试了rest服务,下面记录dubbox消费者工程  一.工程结构    一.Simple.java package bhz.ent ...

  10. [posix]Posix多线程编程

    就不排版了,可以到原作者博客下看 转自:http://www.cnblogs.com/zhangsf/archive/2013/09/09/3309867.html 目录表  摘要 译者序 Pthre ...