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

相关推荐
卷福同学3 小时前
第一次当面试官有感
后端·面试
茶底世界之下3 小时前
导出进度不是一个百分比:AVFoundation 收尾阶段的状态建模
ios·swift
怕浪猫3 小时前
顶级模型一句话,AI 写出了能玩的 QQ飞车
前端·面试·github
呃呃呃呃ex3 小时前
9. TypeScript:从类型系统到工程实践
前端·面试
Blanche15003 小时前
Webpack 构建流程解析
javascript·面试
大熊猫侯佩3 小时前
macOS27 上可变界面尺寸 iOS App 揭秘
macos·ios·swiftui
我叫黑大帅3 小时前
为了知道计算机为什么选择了二进制,我做了这些……
面试·程序员·计算机组成原理
怕浪猫3 小时前
DeepSeek Harness 系列图解
面试·前端框架·node.js
用户2181697049304 小时前
LLVM
ios
zeqinjie4 小时前
Flutter 获取 iPhone Duo 预留区位置
前端·flutter·ios