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

相关推荐
人月神话-Lee3 小时前
【图像处理】Sobel 边缘检测——让机器“看见“轮廓
图像处理·人工智能·计算机视觉·ios·ai编程·swift
kyriewen6 小时前
用魔法打败魔法:我让AI替我去面试前端岗,AI面试官给我打了92分,还发了offer
前端·javascript·面试
Lkstar7 小时前
Vue keep-alive 原理全解:LRU 缓存策略、源码级理解
前端·vue.js·面试
plainGeekDev7 小时前
Android内存面试题:OOM都解决不了,性能优化从何谈起?
android·面试·kotlin
蝎子莱莱爱打怪9 小时前
👍🏻👍🏻6年381颗芯片+韬定律,华为重新定义半导体,为什么还有人喷???
后端·面试·程序员
渐儿10 小时前
RAG / GraphRAG / 向量检索 面试题(完整答案版)
面试
渐儿11 小时前
后端 Python / Node 面试题(完整答案版)
面试
ricardo197311 小时前
代码分割 + 路由懒加载 + 字体子集化:前端瘦身三板斧
前端·面试
I Promise3412 小时前
多传感器融合&模型后处理C++工程师面试参考回答
开发语言·c++·面试
开开心心loky12 小时前
[OC 底层] (三) 方法缓存与消息发送机制
macos·ios·缓存·objective-c·cocoa