美文网首页
Runtime(一):简易字典转模型

Runtime(一):简易字典转模型

作者: RBNote | 来源:发表于2018-05-13 22:45 被阅读14次

runtime常见引用场景:一、关联对象;二、动态获取对象属性,比如实现一个简易的字典转模型方法。 三、交叉方法(黑魔法)
这里介绍用runtime动态获取对象属性,实现一个简易的字典转模型方法。


思路.png

问题:
1.如何动态的获取类的属性列表
2.如何优化,如果类的属性列表已经获取,如何避免反复获取。

  1. 字典转模型时 KVC赋值时不含有某个属性怎么处理?

实现代码
创建NSObject的分类
NSObject+Runtime.h

@interface NSObject (Runtime)
+ (instancetype)rb_objWithDic:(NSDictionary *)dic;

+ (NSArray *)rb_objPropeties;
@end

NSObject+Runtime.m

+ (instancetype)rb_objWithDic:(NSDictionary *)dic {
    
    // 实例化对象
    id object = [[self alloc] init];
    
    // 1>获取对象属性数组
    NSArray *propertyArr = [self rb_objPropeties];
    
    [dic enumerateKeysAndObjectsUsingBlock:^(id  _Nonnull key, id  _Nonnull obj, BOOL * _Nonnull stop) {
        
        // 2>判断数组中是否包含对应的key
        if ([propertyArr containsObject:key]) {
            // 3> kvc设置数值
            [object setValue:obj forKey:key];
        }
    }];
    
    return object;
}
const char *kPropertListKey = "kPropertListKey";
+ (NSArray *)rb_objPropeties {
    
    // ---1.使用`关联对象`动态获取属性 ,如果有值,就直接返回
    /**
     参数:
     1.对象 self
     2.动态属性的 key
     
     返回值:
     id 类型
     这里关联的是一个数组,∴ 用一个数组接收
     */
    NSArray *ptyArr = objc_getAssociatedObject(self, kPropertListKey);
    if (ptyArr != nil) {
        return ptyArr;
    }
    
    /**
     运行时获取对象那个属性列表
     参数:
     1.要获取的类
     2.类属性的个数指针
     
     返回值:
     所有属性的`数组` ,C 数组的名字 就是指向第一个元素地址
     
     C语言中看到retain/create/copy 需要release。最要option+click查看。
     */
    unsigned int count = 0;
    objc_property_t *proList =  class_copyPropertyList([self class], &count);
    // 创建数组
    NSMutableArray *arrM = [NSMutableArray array];
    
    // 遍历所有属性
    for (unsigned int i =0 ; i<count; i++) {
        
        // 1.从数组中取得属性
        // OC中调用C的结构体指针,通常不需要 `*`
        objc_property_t pty = proList[i];
        
        // 2.从pty中获取属性的名称
        const char * cName =  property_getName(pty);
        //        NSLog(@"%s",cName);
        NSString *name = [NSString stringWithCString:cName encoding:NSUTF8StringEncoding];
        
        [arrM addObject:name];
    }
    
    // 内存:释放属性数组
    free(proList);
    
    
    // -----2 到此为止 属性数组已经获取完毕,使用关联对象动态的添加属性
    /**
     参数:
     1. 对象 self
     2. 动态添加的属性的key , 获取值的时候使用 objc_getAssociatedObject
     3. 动态添加的属性的 值
     4. 关联策略
     */
    objc_setAssociatedObject(self, kPropertListKey, arrM.copy, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
    
    return arrM.copy;
}

Demo 地址

相关文章

  • Runtime(一):简易字典转模型

    runtime常见引用场景:一、关联对象;二、动态获取对象属性,比如实现一个简易的字典转模型方法。 三、交叉方法(...

  • runtime运行时之字典模型互转(二)

    上次介绍了runtime自动归档,这次我们来看一下非常常用的-字典转模型/模型转字典。很多朋友都会用到MJExte...

  • runtime字典转模型

    KVC:遍历字典中所有key,去模型中找有没有对应的属性名; Student *stu = [[Studental...

  • 字典转模型(runtime)

    接口返回的key转成属性名 model中嵌套子model 字典转模型

  • runtime字典转模型

    KVC实现字典转模型 模型类Status 其中,模型中的属性都是我通过上篇介绍的自动获取模型属性的方式来获得的外部...

  • Runtime字典转模型

    用一个分类实现字典转模型,分类头文件如下: 如果模型的属性有字典数组,想要将该字典数组转换成模型数组,那么在该模型...

  • iOS开发 runtime应用

    1.runtime的作用 字典转模型 动态修改成员变量 方法交换 给分类添加属性 2.字典转模型 原文参考链接:h...

  • ios runtime 实现json转模型

    runtime 字典转模型,主要是利用runtime的class_copyIvarList方法来获取到类中的所有的...

  • 14-Swift中字典转模型

    字典转模型(初始化时传入字典) 字典转模型(利用KVC转化) 一、 普通的字典转模型: 二、利用KVC字典转模型:

  • 【iOS分享之路-快速上手Runtime】六、字典转模型(二级转

    引述 在上一篇中我们讲述了利用Runtime字典转模型的一级转化,但是,我们发现,在我们的模型中,还是存在字典,如...

网友评论

      本文标题:Runtime(一):简易字典转模型

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