Xcode中使用runtime代码时,建议先做下配置:

使用runtime代码时会有适当的提醒。

OC方法调用的本质是消息转发,消息机制的本质

创建一个Person类,添加方法
- (void)eat
{
NSLog(@"eat方法调用");
} OC方法创建Person的实例对象:
Person *p = [[Person alloc] init];
[p eat]; runtime方法的实现:
// objc_getClass("Person") 等价于 Person.class
// sel_registerName("alloc") 等价于 @selector(alloc)
Person *p = objc_msgSend(objc_getClass("Person"), sel_registerName("alloc"));
p = objc_msgSend(p, sel_registerName("init"));
objc_msgSend(p, sel_registerName("eat"));

在Objective-C中,message与方法的真正实现是在执行阶段绑定的,而非编译阶段。编译器会将消息发送转换成对 objc_msgSend 方法的调用。
objc_msgSend方法动态绑定的过程:
查找selector所指代的程序 IMP(函数指针,即方法的真正实现)。因为不同类对同一方法有不同的实现,所以对方法的真正实现的查找依赖于调用者的类调用该实现,并将一系列参数传递过去将该实现的返回值作为自己的返回值,返回之。消息传递的关键是:编译器构建每个类和对象时所采用的数据结构,每个类都包含以下两个必要元素:①指向父类的指针②调度表【dispatch table】。该调度表将类的selector与方法的实际内存地址关联起来。每个对象都有一个指向所属类的指针isa。通过该指针,对象可以找到它所属的类,也就找到了其全部父类。当向一个对象发送消息时,objc_msgSend方法根据对象的isa指针找到对象的类,然后在类的调度表【dispatch table】中查找selector。如果无法找到selector,objc_msgSend通过指向父类的指针找到父类,并在父类的调度表【dispatch table】中查找selector,以此类推直到NSObject类。一旦查找到selector,objc_msgSend方法根据调度表的内存地址调用该实现。 通过这种方式,message与方法的真正实现在执行阶段才绑定。为了保证消息发送与执行的效率,系统会将全部selector和使用过的方法的内存地址缓存起来。每个类都有一个独立的缓存,缓存包含有当前类自己的 selector以及继承自父类的selector。查找调度表【dispatch table】前,消息发送系统首先检查receiver对象的缓存。缓存命中的情况下,消息发送(messaging)比直接调用方法(function call)只慢一点点点点。

调度表类似(大概):

Class(isa)
SEL编号   IMP函数指针
   

objc_msgSend函数做了动态绑定所需要的一切:
1、它首先找到选标所对应的方法实现。因为不同的类对同一方法可能会有不同的实现,所以找到的方法实现依赖于消息接收者的类型。
2、然后将消息接收者对象(指向消息接收者对象的指针)以及方法中指定的参数传给找到的方法实现。
3、最后,将方法实现的返回值作为该函数的返回值返回。
注意:编译器将自动插入调用该消息函数的代码。您无须在代码中显示调用该消息函数。

runtime - 消息机制的更多相关文章

  1. [转]runtime 消息机制

    原文地址:http://www.jianshu.com/p/f6300eb3ec3d 一.关于runtime 之前在项目中有遇到过用runtime解决改变全局字体的问题,所以再一次感受到了runtim ...

  2. runtime——消息机制

    本文授权转载,作者:Sindri的小巢(简书) 从异常说起 我们都知道,在iOS中存在这么一个通用类类型id,它可以用来表示任何对象的类型 —— 这意味着我们使用id类型的对象调用任何一个方法,编译器 ...

  3. ios学习路线—Objective-C(Runtime消息机制)

    RunTime简称运行时.就是系统在运行的时候的一些机制,其中最主要的是消息机制.对于C语言,函数的调用在编译的时候会决定调用哪个函数( C语言的函数调用请看这里 ).编译完成之后直接顺序执行,无任何 ...

  4. iOS开发runtime学习:一:runtime简介与runtime的消息机制

    一:runtime简介:也是面试必须会回答的部分 二:runtime的消息机制 #import "ViewController.h" #import <objc/messag ...

  5. Objective-C总Runtime的那点事儿(一)消息机制

    最近在找工作,Objective-C中的Runtime是经常被问到的一个问题,几乎是面试大公司必问的一个问题.当然还有一些其他问题也几乎必问,例 如:RunLoop,Block,内存管理等.其他的问题 ...

  6. Objective-C总Runtime的那点事儿(一)消息机制【转】

    RunTime简称运行时.就是系统在运行的时候的一些机制,其中最主要的是消息机制.对于C语言,函数的调用在编译的时候会决定调用哪个函数( C语言的函数调用请看这里 ).编译完成之后直接顺序执行,无任何 ...

  7. NSObject头文件解析 / 消息机制 / Runtime解读 (一)

    NSObject头文件解析 当我们需要自定义类都会创建一个NSObject子类, 比如: #import <Foundation/Foundation.h> @interface Clas ...

  8. 快速上手Runtime(一)之消息机制

    Runtime简介 Runtime简称运行时.OC就是运行时机制,也就是在运行时候的一些机制,其中最主要的是消息机制. 对于C语言,函数的调用在编译的时候会决定调用哪个函数. 对于OC的函数,属于动态 ...

  9. NSObject头文件解析 / 消息机制 / Runtime解读 (二)

    本章接着NSObject头文件解析 / 消息机制 / Runtime解读(一)写 给类添加属性: BOOL class_addProperty(Class cls, const char *name, ...

随机推荐

  1. maya2014无法安装卸载激活失败

    AUTODESK系列软件着实令人头疼,安装失败之后不能完全卸载!!!(比如maya,cad,3dsmax等).有时手动删除注册表重装之后还是会出现各种问题,每个版本的C++Runtime和.NET f ...

  2. JavaScript Date学习实例:获取3分钟前的时间“hhmmss”格式

    上一篇博客分享了Date对象的理论知识,今天正好看到一段相关的代码,可以继续深化,通过实例加强复习Date 题目:获取3分钟前的时间,并且显示格式是hhmmss 以下是看到的代码 var time=n ...

  3. Andrew Ng 的 Machine Learning 课程学习 (week5) Neural Network Learning

    这学期一直在跟进 Coursera上的 Machina Learning 公开课, 老师Andrew Ng是coursera的创始人之一,Machine Learning方面的大牛.这门课程对想要了解 ...

  4. 轮播图jq版

    轮播图的需求 1:图片自己轮播,并且下面的tabs小图标跟着显示 2.鼠标hover到tabs上面显示对应的图片 3.点击左右按钮,显示下一张图片. <div id="oLunbo&q ...

  5. jdk安装完为什么会有两个JRE?

    jdk安装完为什么会有两个JRE? 之所以需要两套 jre ,是因为可以分担工作:当用户只需要执行 java 的程序时,那么 c:\program files\java\jre 下的 jre 就 ok ...

  6. mysql-sql命令

    ##本单元目标 一.为什么要学习数据库 二.数据库的相关概念 DBMS.DB.SQL 三.数据库存储数据的特点 四.初始MySQL MySQL产品的介绍 MySQL产品的安装 ★ MySQL服务的启动 ...

  7. 工作中遇到的vscode配合eslint完成保存为eslint格式

    vscode个人设置 // vscode的个人设置配置 { "workbench.iconTheme": "vscode-icons", "workb ...

  8. Miner3D Basic基础版

    ——强大的数据可视化软件 数据分析并不很复杂,Miner3D Basic基础版首先使用简单的方法,创造了强劲的图形驱动的数据处理模型,然后通过一个完整的视图为基本的交互环境,对基本数据进行分析,并通过 ...

  9. Android GreenDAO 3.0 不修改版本号的情况下增加、删除表、添加字段

    最近项目中使用了GreenDAO的3.0以上的版本,出现需要增加删除表的需求,刚开始用,发现官方对增加和删除的方法是每次去修改数据库版本号,版本一旦升级,那么原来数据库中的表会全部删除再重建.太麻烦, ...

  10. C#保存图片到数据库并读取显示图片的方法

    private void button2_Click_1(object sender, System.EventArgs e) { string pathName; if (this.openFile ...