iOS runtime

runtime 是 oc 语音的基础
首先runtime的核心机制是消息机制 也就是oc的消息机制
首先oc的消息机制可以分为五部分
1 动态语言
2 实例对象 类对象 元类对象之间的关系
3 实例对象instance调用对象方法的过程链
4 类对象调用类方法的过程链
5 runtime objc_msgSend 函数 具体解析

1 动态语言这块

首先 从源代码到程序运行一般分为三个阶段 编译阶段 链接阶段 运行阶段
oc 是动态 动态语音在编译阶段 链接阶段 不知道变量的数据类型 也不知道具体真正实现的那个方法 只有在运行时才会去检查 变量的数据类型 和 根据 方法名查找对应的方法进行实现 这样oc就可以把一些重要的工作从编译阶段 链接阶段 转移到运行阶段 这样就使o c具备更好的灵动性 而实现的的基础就是runtime
而 在编译阶段 链接阶段 只需要进行 代码语法检验 还有就是生成运行时可执行的文件就可以了

2 实例对象 类对象 元类对象之间的关系

实例对象的isa指针指向类对象,类对象的isa指针指向元类对象,元类对象的isa指针指向基类元类对象。因为OC中类实质是一个结构体,除了isa指针,还包含superclass指针(实质都是NSObject的对象),还包含属性方法表等。类是对数据以及方法的封装,所以这三者的关系链也就由isa指针链接起来了。
另外还有就是 类的成员变量 实例方法 归属实例对象 类的类方法归属在原类中 归属该类对象

struct objc_class {
Class _Nonnull isa; // 指向所属类的指针(_Nonnull)
Class _Nullable super_class; // 父类
const char * _Nonnull name; // 类名(_Nonnull)
long version; // 类的版本信息(默认为0)
long info; // 类信息(供运行期使用的一些位标识)
long instance_size; // 该类的实例变量大小
struct objc_ivar_list * _Nullable ivars; // 该类的成员变量链表
struct objc_method_list * _Nullable * _Nullable methodLists; // 方法定义的链表
struct objc_cache * _Nonnull cache; // 方法缓存
struct objc_protocol_list * _Nullable protocols; // 协议链表
} ;

3 实例对象instance调用对象方法的过程链

通过实例对象instance的isa指针找到类对象class,找到即调用
如果找不到,通过实例对象的instance中的superclass找到父类对象,通过父类对象的isa指针找到父类对象的类对象class,找到调用方法
如果仍然找不到,那么系统会通过消息转发机制进行消息转发,走消息转发的响应链,最后如果都没有能够处理消息的方法的话,那么会抛出unselector 的异常

4 类对象调用类方法的过程链

通过类对象class isa指针找到元类对象meta-class,通过存储在元类对象的方法表查找对应的方法进行调用
如果没有找到,那么通过class的superclass 指针找到父类superclass,然后通过父类的superclass的isa指针找到父类的元类对象super-meta-class,通过存储在父类的元类对象meta-class找到类对象进行调用。

5 runtime在其中具体的函数及其作用

Objective-C 语言 中,对象方法调用都是类似 [receiver selector]; 的形式,其本质就是让对象在运行时发送消息的过程。

我们来看看方法调用 [receiver selector]; 在『编译阶段』和『运行阶段』分别做了什么?

编译阶段:[receiver selector]; 方法被编译器转换为:
objc_msgSend(receiver,selector) (不带参数)
objc_msgSend(recevier,selector,org1,org2,…)(带参数)
运行时阶段:消息接受者 recevier 寻找对应的 selector。
通过 recevier 的 isa 指针 找到 recevier 的 Class(类);
在 Class(类) 的 cache(方法缓存) 的散列表中寻找对应的 IMP(方法实现);
如果在 cache(方法缓存) 中没有找到对应的 IMP(方法实现) 的话,就继续在 Class(类) 的 method list(方法列表) 中找对应的 selector,如果找到,填充到 cache(方法缓存) 中,并返回 selector;
如果在 Class(类) 中没有找到这个 selector,就继续在它的 superClass(父类)中寻找;
一旦找到对应的 selector,直接执行 recevier 对应 selector 方法实现的 IMP(方法实现)。
若找不到对应的 selector,消息被转发或者临时向 recevier 添加这个 selector 对应的实现方法,否则就会发生崩溃。
在上述过程中涉及了好几个新的概念:objc_msgSend、isa 指针、Class(类)、IMP(方法实现) 等,下面我们来具体讲解一下各个概念的含义。

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

推荐阅读更多精彩内容

  • >Runtime 介绍 C 语言 作为一门静态类语言,在编译阶段就已经确定了所有变量的数据类型,同时也确定好了要调...
    黎明s阅读 526评论 0 0
  • runtime 和 runloop 作为一个程序员进阶是必须的,也是非常重要的, 在面试过程中是经常会被问到的, ...
    SOI阅读 21,778评论 3 63
  • https://opensource.apple.com/tarballs/objc4/[https://open...
    陈盼同学阅读 333评论 0 2
  • 阅读本文将了解下面几个问题:什么是 Runtime?消息机制的基本原理Runtime中的数据结构Runtime消息...
    SpringSunLcy阅读 1,239评论 0 5
  • Objective-C 是一门动态语言,这就意味着消息传递和类以及对象的创建都在运行时完成,这个核心的库是由 C\...
    valentizx阅读 596评论 0 1