当前位置: 首页 > news >正文

iOS消息发送流程

Objc的方法调用基于消息发送机制。即Objc中的方法调用,在底层实际都是通过调用objc_msgSend方法向对象消息发送消息来实现的。在iOS中, 实例对象的方法主要存储在类的方法列表中,类方法则是主要存储在原类中。

     向对象发送消息,核心就是找到对应的方法,然后传入参数执行。

     其具体过程是:

  1. 确定class已经加载
  2. 从cache中通过hash查找方法
  3. 从类的方法列表中查找
  4. 从父类中查找
  5. 若方法列表是排序过的, 则采用二分法查找;若方法列表未排序,则采用遍历查找。
  6. 若找到方法,执行之;否则,进入消息转发流程。

     需要注意的是, 向super对象发送消息,调用的不是objc_msgSend方法。

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

http://www.lryc.cn/news/309740.html

相关文章:

  • 【接口测试】常见HTTP面试题
  • 服务器硬件基础知识
  • matlab实现层次聚类与k-均值聚类算法
  • 【机器学习】包裹式特征选择之递归特征消除法
  • 【ArcGIS】重采样栅格像元匹配问题:不同空间分辨率栅格数据统一
  • Qt 简约又简单的加载动画 第七季 音量柱风格
  • 【JS】数值精度缺失问题解决方案
  • c++基础知识补充4
  • leetcode230. 二叉搜索树中第K小的元素
  • 医学大数据|文献阅读|有关“肠癌+机器学习”的研究记录
  • Linux信号【systemV】
  • node.js最准确历史版本下载
  • UE5 C++ 单播 多播代理 动态多播代理
  • 前端学习、CSS
  • Flink基本原理 + WebUI说明 + 常见问题分析
  • 3. 文档概述(Documentation Overview)
  • 【vue3 路由使用与讲解】vue-router : 简洁直观的全面介绍
  • ubuntu创建账号和samba共享目录
  • 李沐动手学习深度学习——3.6练习
  • 机器学习_10、集成学习-Bagging(自举汇聚法)
  • 【力扣hot100】刷题笔记Day20
  • Redis 之八:Jdeis API 的使用(Java 操作 Redis)
  • Docker 应用入门
  • 朱维群将出席用碳不排碳碳中和顶层科技路线设计开发
  • linux如何查看磁盘占用情况
  • 【C++庖丁解牛】类与对象
  • 在什么时候企业档案才会发生调整
  • Linux或Windows下判断socket连接状态
  • 编译链接实战(25)gcc ASAN、MSAN检测内存越界、泄露、使用未初始化内存等内存相关错误
  • [HackMyVM]靶场 VivifyTech