ios 对象归档解档 runtime实现

来源:互联网 发布:舒适达专业修复知乎 编辑:程序博客网 时间:2024/04/30 03:10

什么是归档?什么是解档?

归档:就是把对象序列化,序列化就是把对象写到一个指定的app路径下的文件里,app有三个目录分别是:docments、library、tmp,也叫做对象的持久化,ios开发中一般的持久化不支持自定义对象的持久化,归档解档就可以完成自定义对象的持久化。

实现归档解档的步骤:
Step1:要实现对象的归档解档首先继承Coding协议(protocol)

Step2:实现两个方法:encodeWihtCoder: 和 initWithCoder:

runtime实现方法 少写很多的给属性赋值的方法

//归档- (void)encodeWithCoder:(NSCoder*)aCoder{    NSLog(@"归档encodeWithCoder方法调用了");    unsigned int count = 0;    Ivar* ivars = class_copyIvarList([self class], &count);    for (int i = 0; i < count; i++) {    Ivar ivar = ivars[i];    const char* name = ivar_getName(ivar);    NSString* key = [NSString stringWithUTF8String:name];        [aCoder encodeObject:[self valueForKey:key] forKey :key];      }    free(ivars);}//解档- (id)initWithCoder:(NSCoder*)aDecoder{    NSLog(@"解档initWithCoder方法调用了");    if (self == [super init]) {    unsigned int count = 0;    Ivar* ivars = class_copyIvarList([self class], &count);    for (int i = 0; i < count; i++) {    Ivar ivar = ivars[i];    const char* name = ivar_getName(ivar);    NSString* key = [NSString stringWithUTF8String:name];    id value =  [aDecoder decodeObjectForKey:key];//根据key拿到value    [self setValue:value forKey:key];//KVC赋值    }    free(ivars);    }    return self;}

使用: 归档

//获取文件目录NSString* docPatn = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];//NSString* homePath = NSTemporaryDirectory();NSLog(@"docPath = %@",docPatn);NSLog(@"homePath = %@",homePath);NSString* path = [docPatn stringByAppendingPathComponent:@"zht.hank"];  //自定义对象存到文件中[NSKeyedArchiver archiveRootObject:person toFile:path];解档: ZHTPerson* p = [NSKeyedUnarchiver unarchiveObjectWithFile:path]; NSLog(@"name = %@,age = %d",p.name,p.age);
0 0
原创粉丝点击