程序员

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

2018-11-26  本文已影响0人  Mr姜饼

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


上一篇下一篇

猜你喜欢

热点阅读