iOS消息发送流程

Objc的方法调用基于消息发送机制。即Objc中的方法调用,在底层实际都是通过调用objc_msgSend方法向对象消息发送消息来实现的。在iOS中, 实例对象的方法主要存储在类的方法列表中,类方法则是主要存储在原类中。

向对象发送消息,核心就是找到对应的方法,然后传入参数执行。

其具体过程是:

  1. 确定class已经加载
  2. 从cache中通过hash查找方法
  3. 从类的方法列表中查找
  4. 从父类中查找
  5. 若方法列表是排序过的, 则采用二分法查找;若方法列表未排序,则采用遍历查找。
  6. 若找到方法,执行之;否则,进入消息转发流程。

需要注意的是, 向super对象发送消息,调用的不是objc_msgSend方法。

objectivec 复制代码
NSLog(@"NSStringFromClass([self class])=%@",NSStringFromClass([self class]));
NSLog(@"NSStringFromClass([super class])=%@",NSStringFromClass([super class]));

打印结果:
NSStringFromClass([self class])=BankViewController
NSStringFromClass([super class])=BankViewController

为什么 [super class]返回的也是BankViewController呢? 这是因为, super结构体中的receiver指针其实指向的也是self,只是向super发送消息调用的是objc_msgSendSuper方法,该方法在执行消息传递时,会调用查找自己类中的方法,直接从父类开始查找。

相关推荐
koping_wu4 小时前
常用中间件面试汇总:Mysql、Mq、Redis、操作系统、Nacos、Es、Mybatis
mysql·中间件·面试
蒸蒸yyyyzwd4 小时前
后端面试经验
面试·职场和发展
weixin_404157685 小时前
Java高级面试与工程实践问题集(四)
java·开发语言·面试
zhensherlock5 小时前
Protocol Launcher 系列:App Store 精准引流与应用推广
javascript·macos·ios·typescript·iphone·mac·ipad
程序员爱钓鱼6 小时前
Go输出与格式化核心库:fmt包完整指南
后端·面试·go
_饭团6 小时前
C 语言内存函数全解析:从 memcpy 到 memcmp 的使用与模拟实现
c语言·开发语言·c++·学习·算法·面试·改行学it
小金鱼Y6 小时前
前端必看:this 不是玄学!5 大绑定规则帮你永久告别 this 困惑
前端·javascript·面试
tobias.b7 小时前
计算机基础知识-操作系统
考研·面试·职场和发展
向往着的青绿色7 小时前
完全平方数【Letcode279题解】
开发语言·c++·数学·算法·面试·性能优化·动态规划
木斯佳8 小时前
前端八股文面经大全:阿里云AI应用开发二面(2026-03-21)·面经深度解析
前端·css·人工智能·阿里云·ai·面试·vue