美文网首页
利用Runtime实现归档解档

利用Runtime实现归档解档

作者: 有梦想的狼 | 来源:发表于2020-03-05 11:04 被阅读0次

首先我们新建一个Person类,最重要的当然是需要遵守<NSCoding>协议了

@interface Person : NSObject<NSCoding>

@property(nonatomic,copy) NSString *name;
@property(nonatomic,assign) int age;
@property(nonatomic,assign) int age1;
@property(nonatomic,assign) int age2;
@property(nonatomic,assign) int age3;

@end

然后在Person.m文件中实现归档解档的方法

  • 归档
-(void)encodeWithCoder:(NSCoder *)aCoder
{
    unsigned int count = 0;
    //获的Person的所有的属性
    Ivar *ivars = class_copyIvarList([Person class], &count);
    for (int i = 0; i < count; i++) {
        //取出属性并转成字符串
        Ivar ivar = ivars[I];
        const char *name = ivar_getName(ivar);
        NSString *key = [[NSString alloc]initWithUTF8String:name];
        //进行归档
        [aCoder encodeObject:[self valueForKey:key] forKey:key];
    }
}

使用

 Person *person = [Person new];
 person.name = @"zhangsan";
 person.age = 18;
 NSString *temp = NSTemporaryDirectory();
 temp = [temp stringByAppendingPathComponent:@"zhangsan.plist"];
 [NSKeyedArchiver archiveRootObject:person toFile:temp];
  • 解档
-(instancetype)initWithCoder:(NSCoder *)aDecoder
{
    self = [super init];
    if (self) {
        unsigned int count = 0;
        Ivar *ivars = class_copyIvarList([Person class], &count);
        for (int i = 0; i < count; i++) {
            Ivar ivar = ivars[i];
            const char *name = ivar_getName(ivar);
            NSString *key = [[NSString alloc]initWithUTF8String:name];
            id value = [aDecoder decodeObjectForKey:key];
            [self setValue:value forKey:key];
        }
    }
    return self;
}

使用

NSString *temp = NSTemporaryDirectory();
temp = [temp stringByAppendingPathComponent:@"zhangsan.plist"];
Person *person = (Person *)[NSKeyedUnarchiver unarchiveObjectWithFile:temp];
NSLog(@"%@ %d",person.name,person.age);

相关文章

网友评论

      本文标题:利用Runtime实现归档解档

      本文链接:https://www.haomeiwen.com/subject/joutrhtx.html