NSCoding基础及例子
http://mobile.51cto.com/iphone-282203.htm
http://blog.sina.com.cn/s/blog_7b9d64af01019kk5.html
http://blog.youkuaiyun.com/likendsl/article/details/8513733
http://www.cnblogs.com/likwo/archive/2011/05/20/2052048.html
NSCoding是一个protocol. 如果你的类实现了NSCoding.那么就要实现这些方法
NSCoder是archivie 字节流的抽象类.我们可以实现把数据写入一个coder,也可以从coder中读取我们写入的数据. 我们对象的方法initWithCoder:就是从一个coder从读取数据,然后把数据赋给成员变量. 方法encodeWithCoder: 则是把成员变量的值写入到coder中.
- - (id)initWithCoder:(NSCoder *)coder;
- - (void)encodeWithCoder:(NSCoder *)coder;
NSCoder是一个抽象类,我们不会直接使用它来创建对象. 相反,我们会使用从它继承来的子类. 也就是我们使用 NSKeyedUnarchiver类来从字节流中读取数据,而使用NSKeyedArchiver类来把对象写入到字节流
注意事项:
1.同一个对象属性,编码/解码的key要相同!
2.每一种基本数据类型,都有一个相应的编码/解码方法。
如:encodeObject方法与decodeObjectForKey方法,是成对出现的。
3.如果一个自定义的类A,作为另一个自定义类B的一个属性存在;那么,如果要对B进行归档,那么,B要实现NSCoding协议。并且,A也要实现NSCoding协议。
NSSecureCoding
在iOS6中,苹果引入了一个新的协议,是基于NSCoding的,叫做NSSecureCoding。NSSecureCoding和NSCoding是一样的,除了在解码时要同时指定key和要解码的对象的类,如果要求的类和从文件中解码出的对象的类不匹配,NSCoder会抛出异常,告诉你数据已经被篡改了。
大部分支持NSCoding的系统对象都已经升级到支持NSSecureCoding了,所以能安全地写有关归档的代码,你可以确保正在加载的数据文件是安全的。实现的方式如下:
- // Set up NSKeyedUnarchiver to use secure coding
- NSData *data = [NSData dataWithContentsOfFile:someFile];
- NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];
- [unarchiver setRequiresSecureCoding:YES];
- // Decode object
- Foo *someFoo = [unarchiver decodeObjectForKey:NSKeyedArchiveRootObjectKey];