OC 是面向运行时的语言。Runtime就是系统在运行的时候的一些机制,其中最主要的是消息发送机制。OC语言与其他语言(如C语言)在函数(方法)的调用有很大的不同。C语言,函数的调用在编译的时候就已经决定调用哪个函数,编译完成之后直接顺序执行。而对于OC言,方法的调用则不然,在编译的时候不决定调用哪个方法。因为OC的方法调用是消息发送,属于动态调用过程,只有在真正运行的时候才会根据方法的名称找到对应的方法来调用。

OC是怎么实现动态调用的呢?

[obj start];

obj是对象,start是方法名。在编译时Runtime会将上述的代码转化为:

 objc_msgSend(obj,@selector(start));

OC中所有的对象都继承于NSObject

 @interface NSObject <NSObject> {
Class isa OBJC_ISA_AVAILABILITY;
}

在NSObject中存在一个Class的isa指针。下面介绍这个Class:

 struct objc_class {
Class isa OBJC_ISA_AVAILABILITY;//指向metaclass #if !__OBJC2__
Class super_class OBJC2_UNAVAILABLE;//指向其父类
const char *name OBJC2_UNAVAILABLE;//类名
long version OBJC2_UNAVAILABLE;//版本号
long info OBJC2_UNAVAILABLE;//一些标识信息
long instance_size OBJC2_UNAVAILABLE;//该类的实例变量大小
struct objc_ivar_list *ivars OBJC2_UNAVAILABLE;//用于存储每个成员变量的地址
struct objc_method_list **methodLists OBJC2_UNAVAILABLE;//方法列表
struct objc_cache *cache OBJC2_UNAVAILABLE;//指向最近使用的方法的指针
struct objc_protocol_list *protocols OBJC2_UNAVAILABLE;//存储该类遵守的协议
#endif } OBJC2_UNAVAILABLE;
/* Use `Class` instead of `struct objc_class *` */

下面我们看一下方法是如何调用的:

首先,编译器将代码[obj start];转化为objc_msgSend(obj, @selector (start));,在objc_msgSend方法中。首先通过obj的isa指针找到obj对应的class。在Class中先去cache中 通过SEL查找对应方法method(猜测cache中method列表是以SEL为key通过hash表来存储的,这样能提高方法查找速度),若 cache中未找到。再去methodList中查找,若methodlist中未找到,则取superClass中查找。若能找到,则将method加 入到cache中,以方便下次查找,并通过method中的函数指针跳转到对应的方法中去执行。

OC Runtime的更多相关文章

  1. OC - runtime 之关联对象

    header{font-size:1em;padding-top:1.5em;padding-bottom:1.5em} .markdown-body{overflow:hidden} .markdo ...

  2. iOS - OC RunTime 运行时

    1.运行时的使用 向分类中添加属性 // 包含运行时头文件 #import <objc/runtime.h> /* void objc_setAssociatedObject(id obj ...

  3. oc - runtime运行机制

      Objective-C语言是一门动态语言,它将很多静态语言在编译和链接时做的事放到了运行时来处理.同时OC也是一门简单的语言,很大一部分是C的内容,只是在语言层面上加了关键字和语法,真正让OC强大 ...

  4. 18 (OC)* RunTime

    目录: 一.怎么理解OC是动态语言,Runtime又是什么?二.理解消息机制的基本原理三.与Runtime交互的三种方式四.分析Runtime中的数据结构五.深入理解Rutime消息发送原理六.多继承 ...

  5. OC - runtime - 1

  6. OC 相关

    1.OC runtime的理解[转载] http://www.csdn.net/article/2015-07-06/2825133-objective-c-runtime/1

  7. iOS RunTime运行时(1):类与对象

    Objective-C语言是一门动态语言,他将很多静态语言在编译和链接期做的事放到了运行时来处理.这种动态语言的优势在于:我们写代码更具有灵活性,如我们可以把消息转发给我们想要的对象,或者随意交换一下 ...

  8. iOS运行时Runtime浅析

    运行时是iOS中一个很重要的概念,iOS运行过程中都会被转化为runtime的C代码执行.例如[target doSomething];会被转化成objc)msgSend(target,@select ...

  9. Objective-C的对象模型和runtime机制

    内容列表 对象模型(结构定义,类对象.元类和实例对象的关系) 消息传递和转发机制 runtime系统功能理解 对象模型 结构定义 对象(Object): OC中基本构造单元 (building blo ...

随机推荐

  1. [课程设计]Scrum团队分工及明确任务1.0 ----多鱼点餐

    [课程设计]Scrum团队分工及明确任务1.0 ----多鱼点餐 一.开发背景 多鱼点餐系统是一套比较系统化的针对餐厅点餐服务的产品,从顾客进入餐厅点餐到用餐结束再到最后的结账买单,需要全面的.高效的 ...

  2. Mybatis Generator自动生成的mapper只有insert方法

    – Mybatis Generator 生成的mapper只有insert方法 – 首先检查generatorConfig.xml中table项中的属性 enableSelectByPrimaryKe ...

  3. Ionic页面加载前 ionic页面加载完成 ionic页面销毁执行的事件

    ionic 中$ionicView.beforeEnter(页面刚加载前)  $ionicView.afterEnter  (页面加载完成) $destroy(页面销毁) 广播事件 //ionic c ...

  4. Linux LVM硬盘管理之二:创建逻辑卷步骤

    创建逻辑卷(LV)的顺序:Linux分区---物理卷(PV)---卷组(VG)---逻辑卷(LV)---挂载到文件系统 删除逻辑卷(LV)的顺序:卸载文件系统----逻辑卷(LV)---卷组(VG)- ...

  5. Verilog HDL那些事_建模篇笔记(实验七:数码管电路驱动)

    1.同步动态扫描 多个数码管的显示采用的是同步动态扫描方法,同步动态扫描指的是:行信号和列信号同步扫描,是一种并行操作. 2.数码管驱动电路实现思路      如果要求数码管显示我们想要的数字,首先需 ...

  6. Redis 64 steps

    a memo for redis 64 operations start server in console: 1. D:\>cd redis64 2. D:\redis64>redis- ...

  7. Linux下Tomcat服务器重启与关闭

    Linux下Tomcat重新启动 详细请参照原网站链接http://www.cnblogs.com/tovep/articles/2473147.html 在Linux系统下,重启Tomcat使用命令 ...

  8. js api 实现钉钉免登

    js api 实现钉钉免登,用于从钉钉微应用跳转到企业内部的oa,erp等,我刚刚实施完了我公司的这个功能,钉钉用起来还不错. 1 js api 实现钉钉免登,页面配置. <title>利 ...

  9. 关于Maven项目

    用maven 工程搭建项目,在搭建好之后,运行时却抛出了这样的错误:  Error configuring application listener of class org.springframew ...

  10. [MongDB] 主从架构--官方极力不推荐

    一.缘由: 看着数据库大家庭都有主从模式,想着Mongodb应该也不会落下.但从官网看来,先是早先舍弃了Master-Master模式,现在又在不推荐 Master-Slave模式,这是要标新立异呀. ...