运行时(Runtime)机制

运行时机制

  • 运行时机制是用 C++ 开发的,是一套苹果开源的框架
  • OC 是基于运行时开发的语言

应用场景

  1. 运行时动态获取类的属性
    • 主要应用:字典转模型框架 MJExtensionJSONModel
  2. 利用 关联对象 为分类添加属性
  3. 利用 交换方法 拦截系统或其他框架的方法

误区:并不是使用的技术越底层,框架的效率就会越高

----------------------代码演练---------------------

  • 导入头文件
#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);
posted @ 2015-10-28 14:12  邹晟亦楠  阅读(216)  评论(0编辑  收藏  举报