美文网首页
Runtime初涉之消息传递

Runtime初涉之消息传递

作者: Mars飘殇 | 来源:发表于2015-08-29 10:28 被阅读1341次

学习Runtime也有一段时间了,在这里抽空写个相关的文章,就当作记个笔记,方便以后复习回顾。

在学习消息传递机制之前,我们先了解下Runtime的一些概念。

什么是Runtime?

Runtime顾名思义即为运行时。就是系统运行时候的一些机制,它提供了一些使得对象之间能够传递消息的重要函数,其中最主要的就是消息机制了。相较于C语言而言,C语言使用的是“静态绑定”,函数的调用在编译期就能知道运行期所需要调用的函数了,编译完成之后就按照顺序执行(面向过程就是这么任性)。而OC使用的是“动态绑定”特性,也就是说编译器在编译期的时候无法决定运行期调用哪个函数,也就是说在编译阶段,OC可以调用任何函数,即使该函数未实现,但只要声明过就不会报错,而C语言则会报错(怎么能容忍它放纵,必须报错),对象在接收到消息之后,究竟该调用哪个方法完全由运行期决定,甚至可以在程序运行时改变(这里涉及到“消息转发”机制,下篇文章会讲述)。

Runtime相关原理

消息传递机制原理

Runtime所涉及到的范围比较广泛,本文只针对消息传递机制这点进行展开(终于开始重点啦。。。)。好了,我们开始重点。

OC中,当调用某个对象的方法时,其实质上就是向该对象发送了一条消息,比如:

id returnValue = [someObject messageName:paramater];

上面的例子是调用了someObject对象的messageName:方法,并且传入一个参数paramater,并将返回值赋值给id类型的returnValue。在首先介绍消息传递机制之前,先介绍下消息传递机制中所调用的核心函数:

void objc_msgSend(id self, SEL cmd, …)

该函数是个参数可变的函数,能接收两个及以上的参数,第一个参数代表方法接收者,第二个参数带便选择子(SEL是选择子的类型),后续参数则为方法调用所需要的相应参数。

编译器在看到刚才那个例子的消息后会转化成如下C语言函数:

id returnValue = objc_msgSend(someObject, @selector(messageName:), paramater);

objc_msgSend函数会依据接收者选择子来调用适当的方法。首先在自己所属类中的缓存中查找相应方法,若找到就跳转;若缓存中查找不到,则从所属类的方法列表中查找,若在方法列表中找到,则直接跳转并将方法添加到缓存中(OC方法在第一次调用之后会添加到缓存中,以便后续调用该方法能够快速查找到,提高查找速度);若方法列表中也查询不到,则沿着该对象的所属类的继承体系继续向上查找,等找到合适的方法之后跳转并加入到缓存中;如果最终还是找不到相符的方法,就会启动“消息转发”操作(本文不进行展开)。

在每个类中都会有这样一张表格,该表中以选择子的名称作为查找的“键”,每个“键”会对应唯一一个“值”,也即为函数实现(IMP),每次通过相应的“键”来从映射表中查找到对应的值进行返回,这种实现方式可以帮助我们快速定位到所需要的函数。

以上就是最基本的runtime消息传递机制了,如有疑问或者不对的地方欢迎留言提出。

相关文章

  • Runtime初涉之消息传递

    学习Runtime也有一段时间了,在这里抽空写个相关的文章,就当作记个笔记,方便以后复习回顾。 在学习消息传递机制...

  • Runtime初涉之消息转发

    一、消息转发机制 当向某个对象发送一条消息时,若该对象的方法列表以及它相应继承链上的方法列表都无法找到以该消息选择...

  • Runtime初涉之消息转发

    与上次发文间隔也有很长一段时间了,由于各种原因,没有及时拟写文章(好吧,我又矫情了),话不多说,咱们进入正题。 上...

  • iOS - Runtime - 概念和方法交换

    runtime的概述runtime的相关概念runtime消息机制消息传递动态方法解析消息转发runtime的作用...

  • runtime底层实现原理

    一、Runtime介绍二、Runtime源码初探三、Runtime消息传递四、Runtime消息转发五、Runti...

  • iOS Runtime之消息传递

    先上一张经典图: 一、通过上图我们可以得到几个关键词:(Instance of Subclass)实例对象、(cl...

  • OC学习Runtime之消息传递,消息转发机制

    转载自:OC学习Runtime之消息传递,消息转发机制 参考文献:Effective Objective-C No...

  • Runtime 消息传递

    *main.m PersonB.h PersonB.m PersonA.h PersonA.m

  • Runtime消息传递

    Runtime消息传递 一个对象的方法编译器转成消息发送objc_msgSend(obj, foo),Runtim...

  • Runtime 的应用

    前面我们说到:Runtime 消息传递机制Runtime 消息转发机制Runtime 交换方法今天我们来谈谈Run...

网友评论

      本文标题:Runtime初涉之消息传递

      本文链接:https://www.haomeiwen.com/subject/xamkcttx.html