iOS 开发系列:CoreData Object 变成 Fault 的一种方式
@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 If this method returns NO, then the receiver's data must be in memory. However, if this method returns If the receiver is a fault, calling this method does not cause it to fire. ////这句话真心不明确?还请大虾赐教@@ |
iOS 开发系列:CoreData Object 变成 Fault 的一种方式的更多相关文章
- iOS 开发之 - 关闭键盘 退出键盘 的5种方式
iOS 开发之 - 关闭键盘 退出键盘 的5种方式 1.点击编辑区以外的地方(UIView) 2.点击编辑区域以外的地方(UIControl) 3.使用制作收起键盘的按钮 4.使用判断输入字元 5 ...
- 【iOS开发-图层】自己定义图层的两种方式
想要自己定义图层,仅仅须要构建一个类继承CALayer方法 假设让自己定义图层初始化上面就有画好的图形.有两种办法 重写drawInContext方法 自己定义的图层以下的方法.然后必须自己定义的图层 ...
- iOS开发系列--数据存取
概览 在iOS开发中数据存储的方式可以归纳为两类:一类是存储为文件,另一类是存储到数据库.例如前面IOS开发系列-Objective-C之Foundation框架的文章中提到归档.plist文件存储, ...
- 【转】iOS开发系列--数据存取
原文: http://www.cnblogs.com/kenshincui/p/4077833.html#SQLite 概览 在iOS开发中数据存储的方式可以归纳为两类:一类是存储为文件,另一类是存储 ...
- iOS开发系列--Swift进阶
概述 上一篇文章<iOS开发系列--Swift语言>中对Swift的语法特点以及它和C.ObjC等其他语言的用法区别进行了介绍.当然,这只是Swift的入门基础,但是仅仅了解这些对于使用S ...
- iOS开发系列--通知与消息机制
概述 在多数移动应用中任何时候都只能有一个应用程序处于活跃状态,如果其他应用此刻发生了一些用户感兴趣的那么通过通知机制就可以告诉用户此时发生的事情.iOS中通知机制又叫消息机制,其包括两类:一类是本地 ...
- iOS开发系列--并行开发其实很容易
--多线程开发 概览 大家都知道,在开发过程中应该尽可能减少用户等待时间,让程序尽可能快的完成运算.可是无论是哪种语言开发的程序最终往往转换成汇编语言进而解释成机器码来执行.但是机器码是按顺序执行的, ...
- iOS开发系列--通知与消息机制--转
来自:http://www.cocoachina.com/ios/20150318/11364.html 概述 在多数移动应用中任何时候都只能有一个应用程序处于活跃状态,如果其他应用此刻发生了一些用户 ...
- iOS开发系列--Swift语言
概述 Swift是苹果2014年推出的全新的编程语言,它继承了C语言.ObjC的特性,且克服了C语言的兼容性问题.Swift发展过程中不仅保留了ObjC很多语法特性,它也借鉴了多种现代化语言的特点,在 ...
随机推荐
- Linux 使用YUM安装mysql
yum -y install mysql-server ,系统自动下载和安装Mysql的,chkconfig --add mysqld 在服务清单中添加mysql服务service mysqld st ...
- oracle ORA-00119和ORA-00132解决方法
ORA-00119 ORA-00132解决方法. 思路:*.local_listener错误导致.要*.local_listener就要修改spfile文件,因为oracle默认是以spfile文件启 ...
- [hihoCoder] #1055 : 刷油漆
时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 上回说到,小Ho有着一棵灰常好玩的树玩具!这棵树玩具是由N个小球和N-1根木棍拼凑而成,这N个小球都被小Ho标上了不同的数 ...
- asp.net 通用的连接数据库实例代码
asp.net中数据库连接代码,有需要的朋友可以参考一下. <%@ Page Language="C#" AutoEventWireup="true" C ...
- 【Android】9.2 内置行视图的分类和呈现效果
分类:C#.Android.VS2015: 创建日期:2016-02-18 一.简介 Android内置了很多行视图模板,在应用程序中可直接使用这些内置的视图来呈现列表项. 要在ListView中使用 ...
- leetcode ---双指针+滑动窗体
一:Minimum Size Subarray Sum(最小长度子数组的和O(N)) 题目: Given an array of n positive integers and a positive ...
- mysqldump 报导常
Warning: A partial dump from a server that has GTIDs will by default include the GTIDs of all transa ...
- pgrep -f 和pkill -f
pgrep -f abc 匹配出含abc的进程 并输出进程的pid pkill -f abc 杀掉含abc的所有进程
- Mongodb查询引用
var result = db.users.findOne({"name":"Tom Wu"},{"address_ids":1,_id:0 ...
- lua字符串
本文内容基于版本:Lua 5.3.0 概述 Lua字符串中的合法字符可以是任何的1字节数据,这包括了C语言中表示字符串结束的'\0'字符,也就是说Lua字符串在内部将以带长度的内存块的形式存储,存储的 ...