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

相关文章:

  • Vue.js中的$nextTick
  • rsync远程同步
  • django-paramiko远程服务器和文件管理(五)
  • 逆向案例四、进阶,爬取精灵数据咨询前五十页数据
  • [java] 23种设计模式之适配器模式
  • React Developer Tools带你掌握9个React组件调试技巧,十分钟学会
  • docekr 安装 Naocs
  • docker通过dockerfile安装sftp教程。
  • 【学习版】Microsoft Office 2021安装破解教程
  • SpringBoot源码解读与原理分析(三十八)SpringBoot整合WebFlux(一)WebFlux的自动装配
  • AGI概念与实现
  • 二维码门楼牌管理系统技术服务:革新城市标识管理的新篇章
  • C++智能指针
  • 【Fastadmin/ThinkPHP5】使用Queue队列方法详细步骤
  • Leetcode 11. 盛最多水的容器
  • Spring八股 常见面试题
  • IDEA开发环境热部署
  • 用冒泡排序模拟C语言中的内置快排函数qsort!
  • vue项目如何解决金额计算超过15出现精度丢失问题
  • 自然语言处理(NLP)技术
  • 伤者升至80人,伊朗港口爆炸源头或为“危险品和化学品仓库”
  • 年客流超2500万,九岁的上海国际旅游度假区有哪些文旅商体实践?
  • 刘非任中共浙江省委常委、杭州市委书记
  • 在黄岩朵云书院,邂逅陈丹燕与月季花的故事
  • 最大规模的陈逸飞大展启幕:回望他,回望一个时代
  • 交通枢纽、产业升级,上海松江新城有这些发展密码