runtime 进行归档和解档

数据本地持久化时, 一般会将模型进行归档, 从本地获取数据时, 需要解档
下面使用runtime的方式进行归档解档, 复制粘贴即可, 就算后期添加和删减属性, 也不需要对这里做任何操作

第一步, 模型遵守协议 <NSCoding>
第二部, 导入runtime头文件 #import <objc/runtime.h>
第三步, 将下面代码复制粘贴到需要本地化的模型.m文件中即可

- (void)encodeWithCoder:(NSCoder *)encoder
{
    unsigned int count = 0;
    //  利用runtime获取实例变量的列表
    Ivar *ivars = class_copyIvarList([self class], &count);
    for (int i = 0; i < count; i ++) {
        //  取出i位置对应的实例变量
        Ivar ivar = ivars[i];
        //  查看实例变量的名字
        const char *name = ivar_getName(ivar);
        //  C语言字符串转化为NSString
        NSString *nameStr = [NSString stringWithCString:name encoding:NSUTF8StringEncoding];
        //  利用KVC取出属性对应的值
        id value = [self valueForKey:nameStr];
        //  归档
        [encoder encodeObject:value forKey:nameStr];
    }
    //  记住C语言中copy出来的要进行释放
    free(ivars);

}

- (id)initWithCoder:(NSCoder *)decoder
{
    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 stringWithCString:name encoding:NSUTF8StringEncoding];
            id value = [decoder decodeObjectForKey:key];
            //  设置到成员变量身上
            if (!value) continue;
            [self setValue:value forKey:key];
        }
        free(ivars);
    }
    return self;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • *面试心声:其实这些题本人都没怎么背,但是在上海 两周半 面了大约10家 收到差不多3个offer,总结起来就是把...
    Dove_iOS阅读 27,217评论 30 472
  • Swift版本点击这里欢迎加入QQ群交流: 594119878最新更新日期:18-09-17 About A cu...
    ylgwhyh阅读 25,573评论 7 249
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,255评论 4 61
  • 无言7月19日作业: 1、我运动的时候喜欢笑,充满活力的笑,这个时候感觉浑身是力量,平常不笑的时候自己也感觉不好看...
    无言001阅读 353评论 0 0
  • 我们熟悉的、可歌可泣的爱情故事很多,比如《孔雀东南飞》中的焦仲卿与刘兰芝,为了爱情一个自挂东南枝,一个举身赴清池;...
    奔跑的鳄鱼阅读 693评论 0 1