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

相关推荐
從南走到北39 分钟前
JAVA国际版二手车交易二手车市场系统源码支持Android+IOS+H5+APP
android·java·ios
ajassi20002 小时前
开源 Objective-C IOS 应用开发(九)复杂控件-tableview
ios·开源·objective-c
2501_915106322 小时前
iOS性能调优的系统化实践,从架构分层到多工具协同的全流程优化指南(开发者深度版)
android·ios·小程序·架构·uni-app·iphone·webview
uiop_uiop_uiop2 小时前
iOS arm64e hook MGCopyAnswer got Crash or Only Partial results got hooked
macos·ios·cocoa
xiaoxue..5 小时前
深入理解 JavaScript 异步编程:从单线程到 Promise 的完整指南
前端·javascript·面试·node.js
~~李木子~~6 小时前
贪心算法实验1
算法·ios·贪心算法
大炮走火6 小时前
iOS在制作framework时,oc与swift混编的流程及坑点!
开发语言·ios·swift
马拉萨的春天8 小时前
iOS中如果一个大图500M直接加载显示会崩溃,那么如何设置加载显示呢?
macos·ios·cocoa
0***148 小时前
Swift资源
开发语言·ios·swift
z***I3948 小时前
Swift Tips
开发语言·ios·swift