runtime的实用性讲解

runtime 概念

runtime 运行时机制,主要是消息机制。OC 中的方法调用属于消息的发送,动态调用过程,在编译时可以调用任何方法,即使这个方法并没有实现也不会报错,只有在真正运行的时候才会根据方法名找到对应的方法来调用。

oc 和 runtime

  • runtime库里面包含了跟类,成员变量,方法相关的 api 函数,是一套比较底层的纯 C 语言 API,平时写 OC 代码,最后都是转成 runtime 的 c 语言代码。
// OC

[[Person alloc] init];

// runtime

objc_msgSend(objc_msgSend("Person","alloc"),"init")

runtime用来干什么的

  1. 程序运行过程中,动态创建一个类(KVO 的底层实现)
  1. 在程序运行中,动态地为某个类添加属性\方法,修改属性值\方法
  1. 遍历一个类的所有成员变量\属性\所有方法

runtime的相关应用

1.NSCoding(归档和解归档,利用 runtime 遍历对象的所有属性)

2.字典->转模型(利用 runtime遍历模型对象的所有属性,根据属性名从字典中取出对应的值,设置到模型的属性上)

3.KVO(利用 runtime 动态产生一个类)

4.用于封装框架(想怎么改就怎么改)

需要引入头文件

头文件* <objc/runtime.h>* <objc/message.h>

常用的先关函数

objc_msgSend:给对象发送消息

class_copyMethodList:遍历某个类所有的方法

class_copyIvarList:遍历某个类所有的成员变量

class_getClassMethod:获得某个类方法

ivar_getName:查看成员变量

Ivar:成员变量

Method:成员方法

  • 相关的定义
相关定义:

/// 描述类中的一个方法
typedef struct objc_method *Method;

/// 实例变量
typedef struct objc_ivar *Ivar;

/// 类别Category
typedef struct objc_category *Category;

/// 类中声明的属性
typedef struct objc_property *objc_property_t;

类在 runtime 中的表示:

//类在runtime中的表示
struct objc_class {
    Class isa;//指针,顾名思义,表示是一个什么,
    //实例的isa指向类对象,类对象的isa指向元类
#if !__OBJC2__

    Class super_class;  //指向父类
    const char *name;  //类名
    long version;
    long info;
    long instance_size
    struct objc_ivar_list *ivars //成员变量列表
    struct objc_method_list **methodLists; //方法列表
    struct objc_cache *cache;//缓存
    //一种优化,调用过的方法存入缓存列表,下次调用先找缓存
    struct objc_protocol_list *protocols //协议列表
#endif
} OBJC2_UNAVAILABLE;
/* Use `Class` instead of `struct objc_class *` */

代码示例:

+ (void)property
{
    unsigned int outCount;
    // 获取属性列表
    objc_property_t *propertyList = class_copyPropertyList(self, &outCount);
    for (unsigned int i = 0; i<outCount; i++) {
        NSLog(@"属性=======%@",@(property_getName(propertyList[i])));
    }
    // 获得方法列表
    Method * methodList = class_copyMethodList(self, &outCount);
    for (unsigned int i = 0; i< outCount; i++) {
        NSLog(@"方法=====%@",NSStringFromSelector(method_getName(methodList[i])));
    }
    
    // 获得成员变量
    Ivar * ivarList = class_copyIvarList(self, &outCount);
    for (unsigned int i = 0; i<outCount; i++) {
        NSLog(@"成员变量:%@",@(ivar_getName(ivarList[i])));
    }
    
    // 获得协议列表
    __unsafe_unretained Protocol ** protocolList = class_copyProtocolList(self, &outCount);
    for (unsigned int i = 0 ; i < outCount; i++) {
        NSLog(@"协议:%@",@(protocol_getName((protocolList[i]))));
    }
}

代码 github 地址

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,723评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,003评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,512评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,825评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,874评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,841评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,812评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,582评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,033评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,309评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,450评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,158评论 5 341
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,789评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,409评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,609评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,440评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,357评论 2 352

推荐阅读更多精彩内容

  • 对于从事 iOS 开发人员来说,所有的人都会答出【runtime 是运行时】什么情况下用runtime?大部分人能...
    梦夜繁星阅读 3,721评论 7 64
  • 转至元数据结尾创建: 董潇伟,最新修改于: 十二月 23, 2016 转至元数据起始第一章:isa和Class一....
    40c0490e5268阅读 1,704评论 0 9
  • 参考链接: http://www.cnblogs.com/ioshe/p/5489086.html 简介 Runt...
    乐乐的简书阅读 2,134评论 0 9
  • 偶然再次看到一个关于生活如何度过的视频,以下仅附上台词。 The Holstee manifesto This i...
    毛豆姑娘阅读 253评论 2 1
  • 没有太多时间用去感慨,来A城已经第二天了,工作还没着落。每天吃饭租房的硬性开销逼着我必须去找工作了。看了下今天是礼...
    和这个世界温柔的相处阅读 403评论 2 12