最近闲了下来,有时间了就研究一下runtime的运行机制,以前作开发的时候一直也没有特别关注这个东西,只是知道有,可是不多去刻意的使用,研究的不是很深,简单说一下吧,有错误的地方欢迎你们随时指正.html
Objective-C Runtime 是什么?编程
Objective-C 的 Runtime 是一个运行时库(Runtime Library),它是一个主要使用 C 和汇编写的库,为 C 添加了面相对象的能力并创造了 Objective-C。这就是说它在类信息(Class information) 中被加载,完成全部的方法分发,方法转发,等等。Objective-C runtime 建立了全部须要的结构体,让 Objective-C 的面相对象编程变为可能数组
(上段引用自:http://www.cocoachina.com/iOS/20141008/9844.html)xcode
以前对于runtime的理解,只是仅仅局限于对变量或者对象的类型由编译时推迟到了运行时.好比定义一个NSString类型的变量,语句这么写缓存
则会输出函数
很明显,当咱们定义了NSSring类型的变量str以后,其类型并无肯定下来,而是等到运行的时候,才肯定了对象的体现.学习
可是这并非今天要说的重点,若是运行时只有这点功能的话,那么苹果的工程师也就太大材小用了,运行时最重要的做用仍是体如今消息机制上.优化
咱们都知道,OC是一门面向对象的语言,不少时候在解决问题的时候都是站在面向对象的角度来考虑.好比我要建设一座房子,我并不须要考虑如何去建设,只须要考虑把这个任务分给几我的去作,好比A制做窗户,B制做门,C制做屋顶….我只须要考虑把这些任务分配给几我的去作,至于他们是怎么实现的我并不须要考虑.就拿给A分配任务来讲,调用下面的方法:spa
这样就把任务分配给了A,那么在运行时编译后的语句则以下所示.net
objc_msgSend(aPeple,@selector(makeWindow));
将[aPeople makeWindow]转化为了objc_msgSend函数的格式,这个函数有两个参数,第一个参数就是咱们建立的对象,第二个参数是一个方法选择器,使用@selector(makeWindow)来生成一个SEL,SEL就是对方法的一种包装。包装的SEL类型数据它对应相应的方法地址,找到方法地址就能够调用方法.接着根据SEL去aPeople归属的class里去查找,咱们先看一下OC中class的结构,其实Class就是一个指向结构体的指针,其内容以下:
如下是对参数的具体详解,其代码部分来自runtime的源代码,引自:http://blog.csdn.net/uxyheaven/article/details/38113901
(引用结束)
调用objc_msgSend函数的时候,首先会使用@selector(makeWindow)产生的SEL去class的cache里去查找函数的指针,若是在这里找到的话,则直接调用;若是没有找到的话,则去methodList里查找函数的指针,找到的话直接调用,没有找到的话则去super_class里查找,找到后将该函数指针缓存到cache里方便下次的查找.
以上就是我对运行时的消息发送机制的了解,如今了解的仍是比较浅,不够深刻,等之后进一步学习的时候,会将更多的内容分享出来.下一篇文章将会介绍runtime在开发中常常用到的地方.