做项目的时候在iOS4系统遇到过这样一个crash,console显示的错误信息是“Core Data could not fulfill a fault”。

字面意思是什么?“Core Data 无法完成一个错误”,直觉上认为这样翻译肯定是不对的,fault怎么可以fulfill。百思不得其解,唯有求助google,在官方文档《Core Data Programming Guide》(https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CoreData)的“Troubleshooting
Core Data”一章中提到:

Fault cannot be fulfilled

Problem: You see the error message,"Core Data could not fulfill a fault".

Cause: The corresponding object'sunderlying data has been deleted from the persistent store.

Remedy: You should discard this object.

相应对象的基础数据已被从持久存储中删除,你应该抛弃这个对象。

问题成因有两种:

其一:

·       存在对某个managed object的强引用;

·       从managed objectcontext中删除这个managed object;

·       保存managed objectcontext的变化;

At this point, the deleted object has been turned into a fault. It isn’t destroyed because doing sowould violate the rules of memory management.

·       尝试从之前retain的引用中取一个attribute或relationship。

Core Data will try to fault the faultedmanaged object but will fail to do so because the object has beendeleted from the store. That is, there is no longer an object with the sameglobal ID
in the store.

这种情况类似于使用一个已释放对象的成员变量或者调用其方法,即常见的野指针问题。

其二:

·       从一个managed object context中删除某个managed object;

·       未能打破从其他objects到该object的relationships;

·       保存变化。

At this point, if you try to fire the relationship from someother object to that object, it may fail (this depends on the details of theconfiguration of the relationship as that affects how the relationship isstored).

这种情况类似于对象A的delegate对应的对象B释放时,没有将A的delegate设为nil,即没有解除代理关系,其后A继续使用其delegate的方法。这里要强调的是relationship的方向性,其他不再赘述。

通过以上分析以及程序调试,可以确定是第一个原因,这时bug已经能够解决了,至于为什么只在iOS4系统会出现不得而知。但是对fault还是没能弄明白,继续查找,发现文档有这个章节“Faulting and Uniquing”,看完以后,豁然开朗!

Faulting is a mechanism Core Dataemploys to reduce your application’s memory usage. A relatedfeature called uniquing ensures that, in a given managed object context, younever have more than one managed object to represent
a given record.

Faulting

Faulting是Core Data用来减少应用的内存用量的机制。Faulting限制了object graph的大小。A fault is a placeholder object that represents a managed objectthat has not yet been fully realized, or a collection object that represents arelationship。

图1    A department represented by a fault

上图很好的诠释了faulting。Employee的manager、department和reports都是一个fault对象,department的持久变量name、budget和employees却并未初始化。如果持久变量比如name被访问,Core Data会自动初始化这个fault对象,并将数据读取到内存中,这个过程被称作firingthe fault,对用户是透明的。

Turning a managed object intoa fault则是相反过程:能够释放多余的内存,将object的in-memory属性设为nil,并且解除对相关objects的强引用。转换过程可以使用refreshObject:mergeChanges:方法来完成。

Uniquing

Uniquing使得,在一个特定的managed object context中,一条记录只能由一个managed object表示,这个概念类似于单例。

图2    Independent faults for a department object

图3    Uniqued fault for two employees working inthe same department

从图2和图3可以看出,如果不使用uniquing,那么如果要获取所有雇员的department信息,就会fire同样数目的faults,每次都会创建一个新的department对象。这样不仅会占用数倍内存,更会造成数据混乱而无法正确保存context。

总结,faulting和uniquing都是控制内存使用的有效手段。

Core Data could not fulfill a fault的更多相关文章

  1. Core Data 数据出现Fault

    I am mapping Json Data from Server using Restkit and I am Displaying those data by fetching from db. ...

  2. 《驾驭Core Data》 第二章 Core Data入门

    本文由海水的味道编译整理,请勿转载,请勿用于商业用途.    当前版本号:0.4.0 第二章 Core Data入门 本章将讲解Core Data框架中涉及的基本概念,以及一个简单的Core Data ...

  3. Core Data 学习简单整理01

    Core Data是苹果针对Mac和iOS平台开发的一个框架, 通过CoreData可以在本地生成数据库sqlite,提供了ORM的功能,将对象和数据模型相互转换 . 通过Core Data管理和操作 ...

  4. iOS之Core Data及其线程安全

    一.简介 Core Data是iOS5之后才出现的一个框架,它提供了对象-关系映射(ORM)的功能,即能够将OC对象转化成数据,保存在SQLite数据库文件中,也能够将保存在数据库中的数据还原成OC对 ...

  5. Core Data的一些常见用法

    一.简介 Core Data是一个纯粹的面向对象框架,其本质就是一个ORM(对象关系映射:Object Relational Mapping),能以面向对象的方式操作SQLite数据库.在实际开发中绝 ...

  6. Core Data 使用映射模型

    Core Data 使用映射模型 如果新版本的模型存在较复杂的更改,可以创建一个映射模型,通过该模型指定源模型如何映射到目标模型. 创建映射模型,新建File,  Core Data 选择Mappin ...

  7. SELF, self in CORE DATA

    Predicate SELF Represents the object being evaluated. CORE DATA Retrieving Specific Objects If your ...

  8. Core Data浅谈初级入门

    Core Data是iOS5之后才出现的一个框架,它提供了对象-关系映射(ORM)的功能,即能够将OC对象转化成数据,保存在SQLite数据库文件中,也能够将保存在数据库中的数据还原成OC对象.在此数 ...

  9. Core Data

    •   Core Data   是 iOS SDK   里的一个很强大的框架,允许程序员 以面向对象 的方式储存和管理数据 .使用 Core Data 框架,程序员可以很轻松有效 地通过面向对象的接口 ...

随机推荐

  1. 前缀和+排序——cf1043E

    先不考虑第二个条件 要求i和所有其他人的分数和最小,选择x还是y,可以推出一个公式,即差xi-yi小的j都选y,反之都选x 那么按照xi-yi排序即可 然后再考虑第二个条件,做减法就行 /* xi+y ...

  2. 洛谷 2327 [SCOI2005]扫雷

    输入输出格式 输入格式: 第一行为N,第二行有N个数,依次为第二列的格子中的数.(1<= N <= 10000) 输出格式: 一个数,即第一列中雷的摆放方案数. 输入输出样例 输入样例#1 ...

  3. NX二次开发-UFUN打开本地文本文档uc4504

    NX9+VS2012 #include <uf.h> #include <uf_cfi.h> #include <uf_ui.h> using std::strin ...

  4. STM32嵌入式开发学习笔记(五):中断

    我们过去了解了用循环实现延时,或用系统滴答计时器实现延时,但这两种方法都有一种问题:会阻塞处理器的运行.下面我们学习一种不阻塞处理器运行其他事件的功能:时钟中断. 所谓中断,就是让处理器放下手头的事情 ...

  5. 19、javascript基础知识

    1.几天接到了一个奇葩的需求,就是在鼠标滚轮滑动的时候,div要悬浮不动,因此这引起了我对于javascript知识的复习 首先从最基础的变量的类型开始 <!DOCTYPE html> & ...

  6. PHP面试 PHP基础知识 六(正则表达式)

    正则表达式 正则表达式的作用 分割.查找.匹配.替换字符串 分隔符:正斜线(/).hash符号(#).以及取反符号(~)   通用原子:\d(代表十进制的0-9).\D (取反除了0-9).\w(数字 ...

  7. ocaml学习

    ocaml与haskell一样,是functional programming的代表. 对于有一定编程经验的人来说,入手一种新语言,最有效的方式就是开发一些实用的utility,因此top-level ...

  8. UVA - 143 Orchard Trees (点在三角形内)

    题意: 给出三角形的三个点的坐标(浮点数),     问落在三角形内及三角形边上的整点有多少? 思路:所有点暴力判断(点的范围1-99,三角形可能是0-100,因为这个WA了一下orz) AC代码: ...

  9. html select美化模拟jquery插件select2.js

    代码展示:http://www.51xuediannao.com/demo.php 代码说明: select2.js是一个html select美化模拟类jquery插件,但是select2.js又远 ...

  10. Apache配置 PHP 支持

    1,在服务区安装PHP 解压 php 到纯英文路径目 2,添加 PHP处理模块 LoadModule php7_module C:/ProgramData/php/php7apache2_4.dl 3 ...