利用Runtime实现归档解档

2020-03-05  本文已影响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);
上一篇 下一篇

猜你喜欢

热点阅读