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. numpy中的广播

    目录 广播的引出 广播的原则 数组维度不同,后缘维度的轴长相符 数组维度相同,其中有个轴为1 参考: 广播的引出  numpy两个数组的相加.相减以及相乘都是对应元素之间的操作. import num ...

  2. HTML5:离线存储

    最近由于找工作一直没时间也没有精力更新博客,找工作真是一件苦逼的事情啊...不抱怨了,我们来看看HTML5的新特性---离线存储吧. 随着Web App的发展,越来越多的移动端App使用HTML5的方 ...

  3. laravel之ORM增删改查数据

    1.首先在控制器中添加方法,然后添加路由,接着在模型中操作: 以下是模型 2.以下是控制器中的操作 一下是通过ORM进行更新 删除数据

  4. Oracle 备份与恢复

    在进行生产服务器升级.或更换数据库服务器.搭建测试环境时,需要对生产数据库进行备份以及将来可能的还原. 1.expdp导出 expdp DMS version directory=DATA_PUMP_ ...

  5. c语言二级指针内存模型

    第一种: 指针数组作为输入参数 char *myArray[] = {"aaaaaa", "ccccc", "bbbbbb", " ...

  6. Java演算法-「雞兔同籠問題」

    /** * 雞兔同籠問題:窮舉算法思想 */ import java.util.*; public class ChichenAndHabbit { static int chichenNum,hab ...

  7. js表单提交到后台对象接收

    $.extend({ StandardPost:function(url,args){ var form = $("<form method='post' target='_blank ...

  8. radio选中与不选中

    $("input[name='bankCardType']").val("sdf"); $('input:radio[name="bankCardTy ...

  9. Javascript获取服务器时间

    //获取服务器时间 var getServerDate = function () {     var xmlHttpRequest = null,     serverDate = new Date ...

  10. [daily][netcat] 在UNIX socket上使用netcat

    概述 默认情况下,系统里边带的netcat,也就是nc.支持tcp,udp,ipv4,ipv6但是不支持unix socket. 而且,telnet也不支持. 除非自己写一个,不然很不方便. 另一个n ...