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方法,该方法在执行消息传递时,会调用查找自己类中的方法,直接从父类开始查找。

相关推荐
云技纵横1 小时前
@Transactional 到底要不要加 rollbackFor?一次数据不一致事故讲清楚
后端·面试
Moment1 小时前
牛逼,NextJs 从 16.3 开始全面拥抱 Agent Native 🥰🥰🥰
前端·后端·面试
胡萝卜术2 小时前
从“分数打架”到“排名投票”:为什么你的ChatBI必须用RRF?
算法·设计模式·面试
胡萝卜术2 小时前
从暴力到Z字形消元:力扣240「搜索二维矩阵II」的降维打击之路
前端·javascript·面试
敲代码的鱼18 小时前
PDF 预览与签名批注写回 支持安卓 iOS 鸿蒙 UTS插件
android·前端·ios
洛卡卡了19 小时前
我们在用 AI 写代码时,为什么建议要好好维护 AGENTS.md 呢?
面试·agent·claude
时光足迹20 小时前
uni-app 视频通话实战:康复师与患者视频问诊的 6 个致命 Bug 与解决方案
android·ios·uni-app
PBitW20 小时前
GPT训练我的第三天,明白了应该咋说满分回答!😕😕😕
前端·javascript·面试
时光足迹21 小时前
JPush UniApp UTS 插件完全参考手册:API、事件与厂商通道一网打尽
vue.js·ios·uni-app
时光足迹21 小时前
极光推送全攻略(下):uni-app 代码实现与 iOS 排查实战
vue.js·ios·uni-app