首页 > 代码库 > 【OC学习-28】自定义对象的归档和解归档:例子说明以及简单总结

【OC学习-28】自定义对象的归档和解归档:例子说明以及简单总结

对对象进行归档,和对对象进行拷贝差不多路数,也就是需要协议,之前的时对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:归档后的数据内容都是加密的。

【OC学习-28】自定义对象的归档和解归档:例子说明以及简单总结