@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. 怎么在ubuntu中新增一个用户并赋予管理员权限

    用useradd时,并没有创建同名的用户主目录.例子:adduser user1这样他就会自动创建用户主目录,创建用户同名的组.root@ubuntu:~# sudo adduser db[sudo] ...

  2. ubuntu 12.04下如何编译hadoop2.4

    问题导读: 1.如果获取hadoop src  maven包?2.编译hadoop需要装哪些软件?3.如何编译hadoop2.4?扩展:编译hadoop为何安装这些软件? 一.首先下载hadoop源码 ...

  3. MYSQL加入远程用户或同意远程訪问三种方法

    加入远程用户admin密码为password GRANT ALL PRIVILEGES ON *.* TO admin@localhost IDENTIFIED BY \'password\' WIT ...

  4. [k8s]subpath解决cm覆盖目录问题

    参考 发现cm老覆盖容器原有目录里的内容,后来不得不通过in -s的方式来搞cm, 先将cm挂到/tmp下,然后ln -s文件到指定目录. 后来发现个cm的subpath特性可以解决这个问题 写了bu ...

  5. ILRewrite && how to write a profiler

    Rewrite MSIL Code on the Fly with the .NET Framework Profiling API http://clrprofiler.codeplex.com/ ...

  6. django之对FileField字段的upload_to的设定

    用django开发,经常要处理用户上传的文件, 比如user模型里面如果又个人头像的字段 ImageField等等,而django在FielField字段(包括ImageField)的支持和扩展是做的 ...

  7. feginclient和hystrix的配置

    1.如果设置了 feign: hystrix: enabled: true 则 @FeignClient(value = "service-hi",configuration = ...

  8. JSP页面最终是编译为Servlet执行的

    JSP页面最终是编译为Servlet执行的,你可以在Tomcat的%CATALINA_HOME%/work/Catalina/localhost中找到一个文件夹,该文件夹跟你的web-project的 ...

  9. RTX——第11章 临界段,任务锁和中断锁

    以下内容转载自安富莱电子: http://forum.armfly.com/forum.php 临界段代码的临界段也称为临界区,一旦这部分代码开始执行,则不允许任何中断打断.为确保临界段代码的执行不被 ...

  10. dp之二维背包poj1837(天平问题 推荐)

    题意:给你c(2<=c<=20)个挂钩,g(2<=g<=20)个砝码,求在将所有砝码(砝码重1~~25)挂到天平(天平长  -15~~15)上,并使得天平平衡的方法数..... ...