ios 对象归档解档 runtime实现

xiaoxiao2021-02-27  394

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

归档:就是把对象序列化,序列化就是把对象写到一个指定的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);
转载请注明原文地址: https://www.6miu.com/read-1954.html

最新回复(0)