美文网首页
iOS 利用runtime实现model类型的归档解档

iOS 利用runtime实现model类型的归档解档

作者: Cary9396 | 来源:发表于2018-09-10 15:52 被阅读0次

需求分析:在日常开发中,如果我们需要对model数据进行本地存储时,我们都知道,model对象不能直接存入沙盒,我们需要实现NSCoding协议,将对象转化为NSData类型后再进行存储。当我们需要数据时,先取出NSData数据,在转化为model对象来使用。这样我们会遇到一个问题,因为我们需要把model的每一个属性进行encode和decode,这样如果model的属性很少,还好说,如果很多,我们会浪费很多代码。此时,我们可以利用runtime来实现这个功能。原理是通过runtime我们可以在initWithCoder:以及encoderWithCoder:中遍历类的所有变量,取得变量名作为KEY值,最后使用KVC强制取得或者赋值给对象。
代码如下:

- (instancetype)initWithCoder:(NSCoder *)aDecoder {
    
    if (self = [super init]) {
       
        Class c = self.class;
         // 截取类和父类的成员变量
        while (c&&c!=[NSObject class]) {
            unsigned int count = 0;
            Ivar *ivars = class_copyIvarList(c, &count);
            for (int i = 0; i<count; i++) {
                NSString *key = [NSString stringWithUTF8String:ivar_getName(ivars[i])];
                
                id value = [aDecoder decodeObjectForKey:key];
                [self setValue:value forKey:key];
                
            }
            // 获得c的父类
            c = [c superclass];
            free(ivars);
        }
    }
    return self;
}

//归档
- (void)encodeWithCoder:(NSCoder *)aCoder{
    
    Class c = self.class;
    // 截取类和父类的成员变量
    while (c && c != [NSObject class]) {
        unsigned int count = 0;
        
        Ivar *ivars = class_copyIvarList(c, &count);
        
        for (int i = 0; i < count; i++) {
            Ivar ivar = ivars[i];
            NSString *key = [NSString stringWithUTF8String:ivar_getName(ivar)];
            
            id value = [self valueForKey:key];
            
            [aCoder encodeObject:value forKey:key];
        }
        c = [c superclass];
        // 释放内存
        free(ivars);
    }
}

这样就算model有再多属性我们也不会感到头疼了。记得导入#import <objc/runtime.h>头文件。

相关文章

  • runtime使用 自定义数据类型的编码解码

    通过runtime 遍历自定义model的所有属性实现归档解档操作。 要实现我们自定义的model能够自动解档归档...

  • iOS 利用runtime实现model类型的归档解档

    需求分析:在日常开发中,如果我们需要对model数据进行本地存储时,我们都知道,model对象不能直接存入沙盒,我...

  • ios-Runtime(运行时)

    利用runtime来实现归档解档 方法交换 俗称 OC的方法欺骗 KVO的实现原理 用runtime来实现KVO...

  • 利用Runtime实现归档解档

    简易Demo, 示例只包含一些基本属性用于展示实现, 并不包含嵌套关系:

  • 利用Runtime实现归档解档

    首先我们新建一个Person类,最重要的当然是需要遵守协议了 然后在Person.m文件中实现...

  • runTime

    iOS runtime讲解,并且用runtime动态归档与解档 (2015-09-30 22:42:02)转载▼ ...

  • 利用runtime归档-解档

    利用runtime归档的好处就在于,不管类的属性有多少个,都不用担心,它都会自动帮你处理好。 首先新建一个Pers...

  • objc/runtime之——归档反归档

    以上原始手动解档归档代码下载地址如下 runtime实现归档解档代码下载地址如下可以直接拉入项目使用 为什么我们要...

  • iOS归档(转)

    按下home后使用归档保存model数据,返回应用后解档恢复 iOS archive(归档)的总结 - 苹果吧 -...

  • 2018-03-12

    ios通过Runtime动态完成数据存储(归档/解档) 实现数据序列化和反序列化,必定实现的两个方法: 当属性比较...

网友评论

      本文标题:iOS 利用runtime实现model类型的归档解档

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