对对象进行归档,和对对象进行拷贝差不多路数,也就是需要协议,之前的时对NSString和NSNumber这些对象为什么没有归档协议?因为它们自带了。
所以如果我们要对自定义的对象(而不是Foundation里默认的对象)进行归档的话就需要引入归档协议<NSCoding>。
举例:声明一个User类,然后创建一个对象user1,把这个user1进行归档,然后把归档后的文件解归档到user2中,看看是否是原先的那些数据。
(1)User.h
#import <Foundation/Foundation.h>
@interface User : NSObject<NSCoding> //对自定义对象的归档和解归档需引入协议,就像要拷贝对象,那么这个类要引入拷贝协议一样
@property(nonatomic,copy) NSString *name;
@property(nonatomic,copy) NSString *email;
@property(nonatomic,copy) NSString *passwd;
@property(nonatomic,assign) int age;
@end
(2)User.m
#import "User.h"
@implementation User
//以下两个函数格式是系统默认,直接点击NSCoding查看并复制过来即可
- (void)encodeWithCoder:(NSCoder *)aCoder{
[aCoder encodeInt:_age forKey:@"age"];
[aCoder encodeObject:_name forKey:@"name"];
[aCoder encodeObject:_email forKey:@"email"];
[aCoder encodeObject:_passwd forKey:@"passwd"];
}
- (id)initWithCoder:(NSCoder *)aDecoder{
self=[super init];
if (self!=nil) {
_age=[aDecoder decodeIntForKey:@"age"];
self.name=[aDecoder decodeObjectForKey:@"name"];
self.email=[aDecoder decodeObjectForKey:@"email"];
self.passwd=[aDecoder decodeObjectForKey:@"passwd"];
}
return self;
}
@end
(3)main.m
#import <Foundation/Foundation.h>
#import "User.h"
int main(int argc, const char * argv[])
{
@autoreleasepool {
//初始化一个对象病赋值
User *user1=[[User alloc]init];
user1.age=20;
user1.name=@"jack";
user1.email=@"123@163.com";
user1.passwd=@"123456";
//创建文件路径
NSString *filePath=[NSHomeDirectory() stringByAppendingPathComponent:@"self.arc"];
//把这个对象归档
BOOL success=[NSKeyedArchiver archiveRootObject:user1 toFile:filePath];
if (success) {
NSLog(@"success");
}
//解归档
User *user2=[NSKeyedUnarchiver unarchiveObjectWithFile:filePath];//解归档到另一个对象中
NSLog(@"%d,%@,%@,%@",user2.age,user2.name,user2.email,user2.passwd);//输出,完好
}
return 0;
}
归档结果,生成一个文件:
解归档结果:
20,jack,123@163.com,123456
结合之前的一篇笔记,总结:
a:归档的时候,就是先有一个对象,然后有一个最终文件路径,然后利用[NSKeyedArchiver archiveRootObject:<#(id)#> toFile:<#(NSString *)#>]把对象归档到这个文件中;
b:解归档就是,这个归档的对象是什么类型的,你就用什么类型的对象去接这个解归档生成的东西,解归档之后就可以正常使用这个对象了;
c:归档其实有两种方式:上面总结是简单地就是直接把对象归档到一个文件里。还有一种复杂的就是上一个笔记用得例子,把数据对象data进行归档>>>用归档函数把数据写入到data中>>>把data写入到最终文件中,解归档的路径是先把文件接成data对象然后调用里面的数据,其实一般data是一个字典格式;
d:根据对象是自带的还是自定义的,归档也有些许区别:自定义对象要实现归档,那么它的类必须引入归档协议<NSCoding>;
e:归档后的数据内容都是加密的。