NSKeyedArchiever的一些属性(归档)

来源:互联网 发布:回也闻一以知十 赐也 编辑:程序博客网 时间:2024/04/28 00:01

NSKeyedArchiver

 

     //路径的宏

#define PATH @"/Users/mac/Desktop/data.archive"

        //自定义类归档后的文件的路径

#define CUSTOM_PATH @"/Users/mac/Desktop/dog.archive"

        

        //归档:对象序列化,把对象按照一定的数据格式存储到文件里面,方便从文件中读取回对象。

        //解档:反归档,读档。

        //1.系统类的归档

        //第一个参数:要归档的对象

        //第二个参数:路径

        //1.1归档

        NSString *str = @"dataArchive";

        BOOL ret = [NSKeyedArchiver archiveRootObject:str toFile:PATH];

        if (ret) {

            NSLog(@"归档成功");

        }

        else{

            NSLog(@"归档失败");

        }

        //1.2解档:读档,反归档

        //参数:路径

        NSString *str0 = [NSKeyedUnarchiver unarchiveObjectWithFile:PATH];

        NSLog(@"str0 = %@",str0);

        

        //如果要在原有的数据基础上添加新数据(归档/plist),需要先获取到原有的数据,然后把原有数据和这次要添加的数据放到一个数组或字典中,然后把数组或字典重新进行归档(写入plist文件)

        NSArray *array0 = @[@"one",@"two",@"three"];

        //str0 array0 --> NSArray NSDictionary

        NSArray *finalArr = @[str0,array0];

        [NSKeyedArchiver archiveRootObject:finalArr toFile:PATH];

        

        id obj = [NSKeyedUnarchiver unarchiveObjectWithFile:PATH];

        NSLog(@"obj = %@",obj);

        

        //2.自定义类的归档:自定义的类要想进行永久性的存储,只能通过归档的方式。

        Dog *dog = [[Dog alloc]init];

        dog.name = @"xiaobai";

        dog.age = 4;

        

        BOOL customRet = [NSKeyedArchiver archiveRootObject:dog toFile:CUSTOM_PATH];

        if (customRet) {

            NSLog(@"自定义类归档成功");

        }

        else{

            NSLog(@"自定义类归档失败");

        }

        

        id obj1 = [NSKeyedUnarchiver unarchiveObjectWithFile:CUSTOM_PATH];

        NSLog(@"自定义类解归档结果:%@",obj1);

 

Dog.h

 

//遵守协议:使用<>表示协议,<>里面写协议的名字

@interface Dog : NSObject<NSCoding>

//自定义的类要想进行归档,这个自定义的类得遵守NSCoding协议,并且实现协议中的方法

 

@property(copy ,nonatomicNSString *name; //名字

@property(assign ,nonatomic)  int age;     //年龄

 

Dog.m

@implementation Dog

 

//实现协议中的方法

//归档要用到的方法:对要归档的内容进行归档操作

-(void)encodeWithCoder:(NSCoder *)aCoder{

    //对象的归档使用encodeObject:方法

    [aCoder encodeObject:self.name forKey:@"NAME"];

    //基础数据类型的归档使用相应的encodeInt:方法

    [aCoder encodeInt:self.age forKey:@"AGE"];

    

}

//解档(读档,反归档)要用到的方法

-(id)initWithCoder:(NSCoder *)aDecoder{

    //如果当前类的父类也是遵守NSCoding协议的类 --> self = [super initWithCoder:]

    if (self = [super init]) {

        //先判断父类是否初始化成功,如果父类初始化成功,再进行自己的初始化操作

        self.name = [aDecoder decodeObjectForKey:@"NAME"];

        self.age = [aDecoder decodeIntForKey:@"AGE"];

        

    }

    return self;

}

 

-(NSString *)description{

    NSString *str = [NSString stringWithFormat:@"姓名 = %@,年龄 = %d",self.name,self.age];

    return str;

}

 

0 0
原创粉丝点击