码迷,mamicode.com
首页 > 其他好文 > 详细

运行时(Runtime)机制

时间:2015-10-27 20:19:55      阅读:168      评论:0      收藏:0      [点我收藏+]

标签:

运行时机制

  • 运行时机制是用 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);

 

运行时(Runtime)机制

标签:

原文地址:http://www.cnblogs.com/zl-wlt/p/4915252.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!