- 从 关联对象中 获取对象的属性,如果有就返回
- 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