美文网首页
运行时_字典转模型_关联对象提高效率

运行时_字典转模型_关联对象提高效率

作者: KAKA_move | 来源:发表于2016-12-23 19:46 被阅读0次

    - 从 关联对象中 获取对象的属性,如果有就返回

    -  OBJC_getAssociatedObject  调用的时候判断对象的属性的是否已经获取到了,如果或渠道而,直接返回

    - 获取完了属性之后 Objc_setAsssocoatedObject动态创建属性,记录属性的数组;

    - 效果 不用每次都调用运行方法,更加能提高效率

    * 关于效率

    - 我去年做做过JSonModle字典转模型的检测,1000条消耗的时间是4s,用swift的kvc做相同的事情,消耗的时间是20s,sweif对KVC的要求比较高;1000条,JSon消耗的内存是800M,用别的框架去测试,消耗的内存是1.6G,可见提高效率的重要性

    - 用我停工的方法可以更好地解耦,应为第三方框架的在解决嵌套的字典转模型的时候,实现依赖于递归算法,内存的消耗比较大

    - 在所有的字典转模型的框架当中我推荐使用YYModle,因为其功能单一,速度快,消耗低,在测试中胜出.

    #import "NSObject+KAKARunTime.h"#import@implementation NSObject (KAKARunTime)

    + (instancetype) KAKA_objWithDictionary:(NSDictionary* ) dictionary{

    id object = [[self alloc] init];

    //获取对象的属性

    NSArray* propertyList = [self KAKA_ObjProperties];

    //遍历字典进行判断

    [dictionary enumerateKeysAndObjectsUsingBlock:^(id  _Nonnull key, id  _Nonnull obj, BOOL * _Nonnull stop) {

    //判断当下的Key是否是在数组当中

    if ([propertyList containsObject:key]) {

    //如果包含KVC赋值

    [object setValue:obj forKey:key];

    }

    }];

    return object;

    }

    const char * KpropertyListKey = "KpropertyListKey";

    /**

    获取属性数组

    @return 属性数组

    */

    + (NSArray *) KAKA_ObjProperties{

    //从关联对象中获取属性,如果有的话直接返回

    /*

    参数

    1.对象 self

    2.动态属性的Key

    返回值:

    动态添加 "属性值"

    */

    NSArray * objectPlist =  objc_getAssociatedObject(self, KpropertyListKey);

    if (objectPlist != nil) {

    return objectPlist;

    }

    NSMutableArray * pArray = [[NSMutableArray alloc]init];

    unsigned int count = 0 ;

    objc_property_t * propertylist = class_copyPropertyList([self class], &count);

    NSLog(@"%zd",count);

    for (int i = 0; i < count ; i++) {

    objc_property_t pty = propertylist[i];

    const char * cName = property_getName(pty);

    NSString * pString = [NSString stringWithCString:cName encoding:NSUTF8StringEncoding];

    [pArray addObject:pString];

    }

    free(propertylist);

    //2 .到此为止,所有属性获取完毕,利用关联对象,动态去添加属性

    /*

    参数:

    1. 对象: self [OC中 class 也是一个特特殊的对象]

    2.对台添加属性的Key 获取值得时候使用

    3.动态添加属性值

    4.对象的引用关系

    */

    objc_setAssociatedObject(self, KpropertyListKey, pArray.copy, OBJC_ASSOCIATION_COPY_NONATOMIC);

    //    return  objectPlist;

    return pArray.copy;

    }

    @end

    相关文章

      网友评论

          本文标题:运行时_字典转模型_关联对象提高效率

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