1) 当向某个对象发送消息时,先从cache(cache_t)中查找方法对象(method_t),如果找到则进行回调;否则通过查找对象的类(元类)定义中方法列表,一直追溯到NSObject, 如果找到则回调,如果没有找到则调用 resolveInstanceMethod: / resolveClassMethod: 返回一个BOOL 值,可以覆盖此方法动态添加方法,如果没有则调用 forwardingTargetForSelector: 尝试返回一个实现了此方法的对象,如果返回空,则尝试调用完整转发流程 调用 forwardInvocation:, 调用前必须通过 通过 methodSignatureForSelector: / instanceMethodSignatureForSelector: 返回一个方法签名,如果还是不能匹配则进入 默认的doesNotRecognizeSelector 抛出运行期异常。

2) _objc_msgSend、_objc_msgSend_fpret、_objc_msgSend_stret、_objc_msgForward

这几个函数的实现为汇编实现。通常如果一个selector 没有找到而且在 resolveInstanceMethod: / resolveClassMethod: / orwardingTargetForSelector: 都无效(即:没有实现的情况)的情况下,将IMP 替换为 _objc_msgForward 然后启动完整消息转发流程。

3) objc_msgSendSuper,super只是个指示符号,使编译器调用objc_msgSendSuper等系列消息函数,第一个参数为:

/* clang -rewrite-objc 中 */
struct __rw_objc_super {
struct objc_object *object; //当前实例对象指针
struct objc_object *superClass; //父亲的类的指针
__rw_objc_super(struct objc_object *o, struct objc_object *s) : object(o), superClass(s) {}
}; /* message.h 中 */
struct objc_super {
/// Specifies an instance of a class.
__unsafe_unretained id receiver;
__unsafe_unretained Class super_class;
/* super_class is the first class to search */
};

 可以看到,接收者还是当前对象,而类的查找则是从父类开始。

Objective-C RunTime 学习笔记 之 消息转发流程的更多相关文章

  1. Linux进程间通信IPC学习笔记之消息队列(SVR4)

    Linux进程间通信IPC学习笔记之消息队列(SVR4)

  2. 理解Objective-C Runtime(三)消息转发机制

    消息转发机制概述 上一篇博客消息传递机制中讲解了Objective-C中对象的「消息传递机制」.本文需要讲解另外一个重要问题:当对象受到无法处理的消息之后会发生什么情况? 显然,若想令类能理解某条消息 ...

  3. iOS开发·runtime原理与实践: 消息转发篇(Message Forwarding) (消息机制,方法未实现+API不兼容奔溃,模拟多继承)...

    本文Demo传送门: MessageForwardingDemo 摘要:编程,只了解原理不行,必须实战才能知道应用场景.本系列尝试阐述runtime相关理论的同时介绍一些实战场景,而本文则是本系列的消 ...

  4. objc_msgSend消息传递学习笔记 – 对象方法消息传递流程

    在Effective Objective-C 2.0 – 52 Specific Ways to Improve Your iOS and OS X Programs一书中,tip 11主要讲述了Ob ...

  5. Git学习笔记---协作的一般流程

    一般的操作流程 1.pull 王小坤与另一个同事张大炮一起开发一个项目,张大炮昨天修改了数据库读写的api,优化了执行速度,并把read()函数改名成了Read(),下午下班之前把这些代码push到服 ...

  6. 我的runtime学习笔记

    0.简介: OC方法不同于C语言函数,属于动态调用过程,在编译的时候并不能决定真正调用哪个函数,只有在真正运行的时候才会根据函数的名称找到对应的函数来调用. 至于其他理论上的东西不必讲太多,编程讲的就 ...

  7. runtime学习笔记

    获取属性objc_property_t * propertys = class_copyPropertyList(clazz, &outCount); 获取属性名NSString * key ...

  8. AMQ学习笔记 - 03. 消息的接收方式

    概述 消息有两种接收方式:同步接收和异步接收. 同步接收:主线程阻塞式等待下一个消息的到来,可以设置timeout,超时则返回null. 异步接收:主线程设置MessageListener,然后继续做 ...

  9. AMQ学习笔记 - 04. 消息选择器

    概述 消息选择器使用类似于SQL语法,为Consumer指定基于Message属性的筛选条件. 消息选择器 发送的时候,给消息添加一些属性:在接收的时候,根据属性进行过滤. API javax.jms ...

随机推荐

  1. eclipse 中 导入git项目无法导入的问题

    研发在git上打了一个分支,需要重新导入分支项目.此时发现与之前相同模式导入失败,不起作用. 解决: 需要在Git Repositories中对应项目下找到.project 文件并进行修改,修改项目名 ...

  2. matplotlib 命令行画图保存

    服务器上没有图形界面,需要用matplotlib画图并直接保存成图片,然后下载到客户端查看. 1. 首先安装matplotlib: python -m pip install -U matplotli ...

  3. 入门级----黑盒测试、白盒测试、手工测试、自动化测试、探索性测试、单元测试、性能测试、数据库性能、压力测试、安全性测试、SQL注入、缓冲区溢出、环境测试

    黑盒测试 黑盒测试把产品软件当成是一个黑箱子,只有出口和入口,测试过程中只要知道往黑盒中输入什么东西,知道黑盒会出来什么结果就可以了,不需要了解黑箱子里面是如果做的. 即测试人员不用费神去理解软件里面 ...

  4. Windows Server 2012设置VMWare以服务方式启动(注销后也可以运行,开机也可以自动运行)

    场景:要用一台服务器(Windows Server 2012),加装了一张双口的千兆网卡,安装一个虚拟机,使用爱快在虚拟机里当做软路由. - 那么问题来了,我这台是只能远程的,如果软路由没启动,怎么办 ...

  5. Java 整数型的进制间的互相转换

    /** * 整数型, 进制间的互相转换 */ public class IntConversion { public static void main(String[] args) { int num ...

  6. HTML4入门

    这篇来介绍下超链接和网站架构,做好准备要开始了! 超链接:从一个文档链接到另一个文档,也可以式文档的指定部分及文档内跳转,也俗称设置锚点:点击超链接将使网络浏览器跳转到另一个网址.url可以指向HTM ...

  7. window iis重启

    WINDOWS server 任务计划实现定时自动重启IIS编写批处理文件IIS.bat@echo offnet stop iisadmin /yesnet start iisadminnet sta ...

  8. JavaScript基础知识(Date 的方法)

    Date 的方法 console.log(typeof Date);// "function" Date的实例 console.log(typeof new Date()); // ...

  9. springmvc+hibernate

    <本文摘要他人> 1.设计数据库:设计好表结构,最好符合3NF,采用Hibernate tools将设计好的表自动生成对应的实体entity. 1.创建Maven项目,按需映入Maven包 ...

  10. dhtmlx Gantt实例介绍分析

    API地址:https://docs.dhtmlx.com/gantt/desktop__guides.html,这是英文的网页,可以用谷歌打开然后页面翻译,就是中文的啦! 我用的是DHTMLX Ga ...