博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Objective-C RunTime 学习笔记 之 消息转发流程
阅读量:4617 次
发布时间:2019-06-09

本文共 1255 字,大约阅读时间需要 4 分钟。

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 */};

 

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

 

 

转载于:https://www.cnblogs.com/chengsh/p/8708169.html

你可能感兴趣的文章
Ubuntu 下搭建SVN服务器
查看>>
css3转换
查看>>
读取文件,按行输出
查看>>
UVA 11825 Hackers' Crackdown - 状压dp
查看>>
正则表达式
查看>>
向PHP发送HTTP-Get请求
查看>>
本周作业
查看>>
Python中的 matplotlib(二)随机漫步
查看>>
rsyslog 传输日志
查看>>
14.5.2.3 Consistent Nonlocking Reads 一致性非锁定读
查看>>
apache性能优化
查看>>
UNDO 100%
查看>>
MaReduce理论
查看>>
CentOS7安装RabbitMQ
查看>>
ubuntu下USB口插入USB转TTL查看串口号
查看>>
mysql乐观锁和悲观锁
查看>>
Zend引擎探索 之 PHP中前置递增不返回左值
查看>>
将字符串中不同字符的个数打印出来
查看>>
java第三次上机
查看>>
android Javah生成JNI头文件
查看>>