八面玲珑的 objc_msgSend

此函数是消息发送必经之路,但只要一提 objc_msgSend,都会说它的伪代码如下或类似的逻辑,反正就是获取 IMP 并调用:


id objc_msgSend(id self, SEL _cmd, ...) {
Class class = object_getClass(self);
IMP imp = class_getMethodImplementation(class, _cmd);
return imp ? imp(self, _cmd, ...) : 0;
}

回顾 objc_msgSend 伪代码

回过头来会发现 objc_msgSend 的伪代码描述得很传神啊,因为class_getMethodImplementation 的实现如下:


IMP class_getMethodImplementation(Class cls, SEL sel)
{
IMP imp;
if (!cls || !sel) return nil;
imp = lookUpImpOrNil(cls, sel, nil, YES/*initialize*/, YES/*cache*/, YES/*resolver*/);
// Translate forwarding function to C-callable external version
if (!imp) {
return _objc_msgForward;
}
return imp;
} 消息发送与转发路径流程图
 
http://yulingtianxia.com/blog/2016/06/15/Objective-C-Message-Sending-and-Forwarding/

最新文章

  1. MVC MemeberShip vs. Asp.net Identity
  2. Java 线程并发策略
  3. JSON详解(转)
  4. jquery获取当前元素的坐标
  5. c++模板实例化的一个例子
  6. 发现中文版《C Primer Plus第五版》示例程序的一个错误
  7. Java 中使用Jackson反序列化
  8. 关于QT中evaluateJavaScript()函数返回值的处理问题
  9. 用NodeJS创建一个聊天服务器
  10. 末学者笔记--shell编程上 2 玄
  11. PL/SQL变量的作用域和可见性
  12. jdk1.8api帮助文档,转载
  13. mysql随笔系列-1
  14. Codeforces Round #545 (Div. 2)(D. Camp Schedule)
  15. 2018-2019-2-20175225 实验二《Java开发环境的熟悉》实验报告
  16. 使用dd命令制作U盘启动盘wodim刻录光盘cd dvd
  17. windows开机自动登录
  18. asp.net MVC4 框架揭秘 读书笔记系列2
  19. android——inflater 用法(转)
  20. debian系统,启动Wireshark,出现Couldn't run /usr/bin/dumpcap in child process:权限不够

热门文章

  1. .Net Core 基于 SnmpSharpNet 开发
  2. 全国自考C++程序设计
  3. inode是什么?
  4. 《C程序设计语言》(K&R)中文高清非扫描件
  5. Python协程介绍(转)
  6. group by 对多个字段进行分组
  7. 关于Svn服务总是链接异常
  8. JavaScript入门(二)
  9. 前端自动显示信息的小demo
  10. 换个语言学一下 Golang (10)——并行计算