IOS NSKeyedArchiver 归档,和解档

嘿嘿,今天我跟大家分享一个我最近写的一个小东西,其实在项目开发中,我相信大家都遇到过对一个对象进行归档,但是这个对象又是我们自定义的,或者这个对象中有我们自定义的对象,这时候如果对每个自定义对象都去实现一遍

- (void)encodeWithCoder:(NSCoder *)aCoder,和 - (instancetype)initWithCoder:(NSCoder *)aDecoder 这个两个方法,那如果有一个百个,一千个呢,是不是都要去自定义实现这两个方法。当然你也可以去这样做,我是比较懒的,我自己写了一个NSObject的类别,来实现所有的NSObject 子对象的归档,废话不多说,上代码

@implementation NSObject (KeyedArichiver)

- (void)encodeWithName:(NSString *)name{

    NSString *rootPath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) objectAtIndex:0];

    if(!name||name.length==0){

        name = NSStringFromClass([self class]);

    }

    NSString *path =[rootPath stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.arichiver",name]];

    [NSKeyedArchiver archiveRootObject:self toFile:path];

}

+ (instancetype)decodeWithName:(NSString *)name{

    NSString *rootPath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) objectAtIndex:0];

    NSString *path =[rootPath stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.arichiver",name]];

     return [NSKeyedUnarchiver unarchiveObjectWithFile:path];

}


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

   unsigned int outCount;

   Ivar *vars = class_copyIvarList([self class], &outCount);

    for(int i=0;i<outCount;i++){

        Ivar var = vars[i];

        NSString *name = [NSString stringWithUTF8String:ivar_getName(var)];

        id value = [self valueForKey:name];

        [aCoder encodeObject:value forKey:name];

    }

}

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

    self = [self init];

    if(self){

        unsigned int outCount;

        Ivar *vars = class_copyIvarList([self class], &outCount);

        for(int i=0;i<outCount;i++){

            Ivar var = vars[i];

            NSString *name = [NSString stringWithUTF8String:ivar_getName(var)];

            id value = [aDecoder decodeObjectForKey:name];

            [self setValue:value forKey:name];

        }

    }

    return self;

}

@end


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值