运行时(Runtime)机制
运行时机制
- 运行时机制是用 C++ 开发的,是一套苹果开源的框架
- OC 是基于运行时开发的语言
应用场景
- 运行时动态获取类的属性
- 主要应用:字典转模型框架
MJExtension
,JSONModel
- 主要应用:字典转模型框架
- 利用
关联对象
为分类添加属性 - 利用
交换方法
拦截系统或其他框架的方法
误区:并不是使用的技术越底层,框架的效率就会越高
----------------------代码演练---------------------
- 导入头文件
#import <objc/runtime.h>
获取对象属性列表
第1步-获取对象属性数量
+ (NSArray *)properties {
unsigned int count = 0;
class_copyPropertyList(self.class, &count);
NSLog(@"属性数量 %u", count);
return @[@"title", @"digest", @"replyCount", @"imgsrc"];
}
第2步-获取对象属性名称
+ (NSArray *)properties {
unsigned int count = 0;
objc_property_t *list = class_copyPropertyList(self.class, &count);
for (unsigned int i = 0; i < count; ++i) {
const char *cname = property_getName(list[i]);
printf("%s\t", cname);
}
printf("\n");
// 释放属性数组
free(list);
return @[@"title", @"digest", @"replyCount", @"imgsrc"];
}
第3步-生成属性数组
+ (NSArray *)properties {
unsigned int count = 0;
objc_property_t *list = class_copyPropertyList(self.class, &count);
NSMutableArray *arrayM = [NSMutableArray arrayWithCapacity:count];
for (unsigned int i = 0; i < count; ++i) {
const char *cname = property_getName(list[i]);
[arrayM addObject:[NSString stringWithUTF8String:cname]];
}
// 释放属性数组
free(list);
NSLog(@"%@", arrayM);
return arrayM;
}
利用关联对象实现性能优化
/// 关联对象键值
const char* propertiesKey = "propertiesKey";
...
// 判断是否能存在关联对象
NSMutableArray *arrayM = objc_getAssociatedObject(self, propertiesKey);
if (arrayM != nil) {
return arrayM;
}
...
// 设置关联对象
objc_setAssociatedObject(self, propertiesKey, arrayM, OBJC_ASSOCIATION_COPY_NONATOMIC);
现在不玩命,以后命玩你