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 小时前
iOS实现 WKWebView 长截图的优雅方案
ios
NAGNIP2 小时前
机器学习特征工程中的特征选择
算法·面试
J_liaty2 小时前
RabbitMQ面试题终极指南
开发语言·后端·面试·rabbitmq
NAGNIP2 小时前
机器学习中的数据预处理方法大全!
算法·面试
a程序小傲3 小时前
得物Java面试被问:方法句柄(MethodHandle)与反射的性能对比和底层区别
java·开发语言·spring boot·后端·python·面试·职场和发展
笔COOL创始人4 小时前
requestAnimationFrame 动画优化实践指南
前端·javascript·面试
UrbanJazzerati4 小时前
统计学基础与数据可视化实战——基本图表(1)
面试
前端不太难6 小时前
Flutter / RN / iOS,在长期维护下的性能差异本质
flutter·ios
小当家.1057 小时前
JVM八股详解(上部):核心原理与内存管理
java·jvm·学习·面试
heartbeat..7 小时前
Spring 声明式事务:原理、使用及失效场景详解
java·spring·面试·事务