第10章 Archiving
10.1 数据的archiving
当我们需要存储程序里的信息,使得我们下次打开程序时,可以从存储的信息里重新构造对象。这个时候就需要用到Archiving。
要实现Archiving需要两个步骤:一.告诉对象如何archive自己。二.启动archiving。
一. 实现第一个步骤需要用到两个函数。
1)编码 -(void)encodeWithCoder: (NSCoder *)coder; 变量 ---> coder
可以使用 encodeObject,encodeBool, encodeDouble, encodeFloat, encodeInt等函数。
2)解码 -(id)initWithCoder: (NSCoder *)coder coder--->变量
可以使用 decodeObjectForKey, decodeBoolForKey,等函数。
3)protocol的概念
protocol就是借口的意思,要实现一个接口,必须实现protocol里定义的所有函数。
NSCoding接口需要实现的接口函数就是上面提到的编码和解码函数。为了声明实现了protocol,需要在类声明里加上<>。例
如:@interface Person : NSObject<NSCoding>
二. 知道如何编解码之后,需要知道如何启动他们。
对于document类型的程序。在save和load时,我们可以启动这个过程。
1)saving时
需要实现函数 -(NSData *)dataOfType: (NSString *)aType error: (NSError **)outError
{return [NSKeyedArchiver archivedDataWithRootObject:employees]}
2)loading时
需要实现函数 -(BOOL)readFromData: (NSData *)data ofType: (NSString *)typeName error: (NSError **)outError
{
NSMutableArray *newArray = nil;
newArray = [NSKeyUnarchiver unarchiveObjectWithData:data];
[self setEmployees:newArray];
return YES;
}
10.2 额外知识
1.文档架构
Document 类型的程序相比于普通的程序,需要完成下面的这些功能。
1) 数据的储存和加载。2) 数据的显示。3) 视图变化后数据的更新。
所有的document都由一个NSdocumentController控制。
NSDocumentController--->NSMutableArray--->document 1
--->document 2
....
2.为程序设置图标和扩展名。
3.如何防止循环archiving。
因为我们在archiving一个对象时,会archiving这个对象引用到的其它对象。当出现循环引用的情况时,就会出现无限的archiving了。如何解决这个问题?
在archiving时,对于已经archived的对象,可以用一个特殊的符号代表它。
4.如何创建一个protocol。
5.在编辑,撤销编辑之后,知道不需要保存更改?
在内部对于变化会有一个计数。当change产生时,count++。当undo执行时,count--。如果count==0 就表示没有需要保存的数据了。