用来做数据存储,将对象可以写成一个二进制流,保存成一个本地文件。
NSCoding首先是一个协议,类实现这个协议,这个类的实例才能被编码(encode)和译码(decode)。类实现了这个协议,编码器才能在编码的时候知道如何编码,解码器才能在解码的时候知道如何解码。这个类才知道如何写成一个NSData,以及如何读取一个NSData将其转换为这个类。
这里边有两个方法:
1.initWithCoder(NSCoder:coder)//从coder中读取数据,保存到相应的变量中,即反序列化数据
2.encodeWithCoder(NSCoder:coder)//读取实例变量,并把这些数据写到coder中去。序列化数据
其实就是定义了一个规则,编码解码的时候需要按照这个规则去操作。 但是编码解码的过程是由NSCoder的子类去调用的:
NSCoder又是什么?
NSCoder是一个抽象类,抽象类不能被实例化,只能提供一些想让子类继承的方法。下边两个就是其子类。
NSKeyedUnarchiver 从二进制流读取对象。
NSKeyedArchiver 把对象写到二进制流中去。
主要的作用如上所述,完成对象到二进制流的转换
如何实现自定义归档
自定义对象归档,其实就是将自定义类型先转换为一个NSData然后对其进行归档。所以自定义归档首先要解决的是两个问题,如何将一个自定义对象编码成一个NSData;以及如何在反归档的时候,如何将NSData转换为一个自定义的对象。
NSCoding协议解决了这两个问题。这个协议里边有两个方法:
1.就是从coder中读取数据,保存到相应的变量中去。
2.就是读取实例变量,序列化之后将数据写到coder中去。
实现了这两个方法,那么我们在归档或者反归档的时候就有了编码和解码的依据。
然后通过[NSKeyedArchiverarchiveRootObject:self.askQADraftModelArraytoFile:filePath];将数据保存到文件;
通过[NSKeyedUnarchiverunarchiveObjectWithFile:filePath];从文件中读取数据
网友评论