美文网首页程序员
了解字典转model的底层机制(runtime)

了解字典转model的底层机制(runtime)

作者: Mr姜饼 | 来源:发表于2018-11-26 09:21 被阅读0次

    网上所有的字典转模型的三方框架最底层的实现原理莫过于此,你们去看一下就会明白了,比如MJExtension

    ```

    constchar*kPropertyListKey ="YFPropertyListKey";

    + (NSArray*)yf_objcProperties

    {

    /* 获取关联对象 */

    NSArray*ptyList = objc_getAssociatedObject(self, kPropertyListKey);

    /* 如果 ptyList 有值,直接返回 */

    if(ptyList)

     {return    ptyList; }

    /* 调用运行时方法, 取得类的属性列表 *//* 成员变量:

        * class_copyIvarList(__unsafe_unretained Class cls, unsigned int *outCount)

        * 方法:

        * class_copyMethodList(__unsafe_unretained Class cls, unsigned int *outCount)

        * 属性:

        * class_copyPropertyList(__unsafe_unretained Class cls, unsigned int *outCount)

        * 协议:

        * class_copyProtocolList(__unsafe_unretained Class cls, unsigned int *outCount)

        */unsignedintoutCount =0;/**

        * 参数1: 要获取得类

        * 参数2: 类属性的个数指针

        * 返回值: 所有属性的数组, C 语言中,数组的名字,就是指向第一个元素的地址

        *//* retain, creat, copy 需要release */

    objc_property_t *propertyList = class_copyPropertyList([selfclass], &outCount);

    NSMutableArray*mtArray = [NSMutableArrayarray];

    /* 遍历所有属性 */

    for(unsignedinti =0; i < outCount; i++) 

    {

    /* 从数组中取得属性 */

    objc_property_t property = propertyList[I];

    /* 从 property 中获得属性名称 */

    constchar*propertyName_C = property_getName(property);

    /* 将 C 字符串转化成 OC 字符串 */

    NSString*propertyName_OC = [NSStringstringWithCString:propertyName_C encoding:NSUTF8StringEncoding];      

      [mtArray addObject:propertyName_OC];  

      }/* 设置关联对象 *//**

        *  参数1 : 对象self

        *  参数2 : 动态添加属性的 key

        *  参数3 : 动态添加属性值

        *  参数4 : 对象的引用关系

        */

    objc_setAssociatedObject(self, kPropertyListKey, mtArray.copy, OBJC_ASSOCIATION_RETAIN_NONATOMIC);

    /* 释放 */

    free(propertyList);

    returnmtArray.copy;

    }

    + (instancetype)modelWithDict:(NSDictionary*)dict 

    {

    /* 实例化对象 */

    idobjc = [[selfalloc]init];

    /* 使用字典,设置对象信息 */

    /* 1. 获得 self 的属性列表 */

    NSArray*propertyList = [selfyf_objcProperties];

    /* 2. 遍历字典 */

    [dict enumerateKeysAndObjectsUsingBlock:^(id_Nonnull key,id_Nonnull obj,BOOL* _Nonnull stop) {

    /* 3. 判断 key 是否字 propertyList 中 */

    if([propertyList containsObject:key]) 

    {

    /* 说明属性存在,可以使用 KVC 设置数值 */

    [objc setValue:obj forKey:key];   

         }  

      }];

    /* 返回对象 */

    returnobjc;

    }

    ```

    //总结:

    首先获取model所有的属性列表

    再然后根据dict的key来往里面添加value


    相关文章

      网友评论

        本文标题:了解字典转model的底层机制(runtime)

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