一、抛砖引玉

  • objc_msgSend() 消息发送的过程就是 通过 SEL 查找 IMP 的过程 。
  • objc_msgSend() 是用 汇编语言 实现的,使用汇编实现的优势是:
    • 消息发送的过程需要足够的快速,高级语言在执行的时候都是需要翻译成汇编语言,经过编译成被机器识别的 二进制文件 ,使用汇编可以省去这一翻译过程,可以更快速被机器识别;
    • 对于消息的发送,存在很多未知的参数,这有很多不确定性,使用 汇编的寄存器 要比 C 或者 C++ 表现好的多。
  • objc_msgSend() 通过汇编 快速查找方法缓存 ,如果能找到则调用 TailCallCachedImp 直接将方法缓存起来然后进行调用,objc_msgSend() 的快速查找请参考之前的文章:iOS之深入解析Runtime的objc_msgSend“快速查找”底层原理。
  • 如果在缓存中查找不到,则就跳转到 CheckMiss ,然后执行 慢速查找流程 。objc_msgSend() 的慢速查找请参考之前的文章:

iOS之深入解析objc_msgSend消息转发机制的底层原理相关推荐

  1. iOS之深入解析dyld与ObjC关联的底层原理

    App启动与dylb加载 我们知道 dyld 的加载过程,即在 App 启动启动执行 main 函数之前,dylb 主要作了环境变量配置.共享缓存.主程序的初始化.插入动态库.链接主程序.链接动态库. ...

  2. iOS之深入解析内存管理Tagged Pointer的底层原理

    一.前言 ① Tagged Pointer 概念 iOS 开发者对"引用计数"这个名词肯定不陌生,引用计数是苹果为了方便开发者管理内存而引入的一个概念.当引用计数为 0 时,对象就 ...

  3. iOS之深入解析自动释放池autoreleasepool的底层原理

    一.自动释放池 autoreleasepool 原理 自动释放池是 OC 中的一种内存自动回收机制,它可以将加入 autoreleasePool 中的变量 release 的时机延迟. 简单来说,就是 ...

  4. iOS之深入解析类方法+load与+initialize的底层原理

    一.前言 Objective-C 作为一门面向对象语言,有类和对象的概念.编译后,类相关的数据结构会保留在目标文件中,在运行时得到解析和使用.在应用程序运行起来的时候,类的信息会有加载和初始化过程. ...

  5. 消息转发机制与Aspects源码解析

    前言 最近在搞重构相关的事情,遇到了不少这样的场景: 进入一个界面,在viewWillAppear:的时候做相应判断,如果满足条件则执行对应代码. 这类业务有一个特点,业务内容是对应整个App的,与对 ...

  6. iOS 消息转发机制

    这篇博客的前置知识点是 OC 的消息传递机制,如果你对此还不了解,请先学习之,再来看这篇.这篇博客我尝试用口语的方式像讲述 PPT 一样给大家讲述这个知识点. 我们来思考一个问题,如果对象在收到无法解 ...

  7. 【iOS沉思录】Objective-C语言消息传递机制三道防线:消息转发机制详解

    消息传递机制: 在OC中,方法的调用不再理解为对象调用其方法,而是要理解成对象接收消息,消息的发送采用'动态绑定'机制,具体会调用哪个方法直到运行时才能确定,确定后才会去执行绑定的代码.方法的调用实际 ...

  8. runtime(三) Objective-C 的消息转发机制与动态添加方法

    在上上一篇博客 runtime系列(一) objc_msgSend 中介绍了运行时的消息传递机制,但是却没有说对象收到消息却无法解读该怎么办.本篇博客就着重介绍当消息传递时无法解读的时候就会启动的 消 ...

  9. iOS-动态方法决议与消息转发机制

    在消息发送机制中我们介绍过,OC是动态语言,对象调用方法其实就是对象接收消息,而消息的发送采用"动态绑定"机制,具体会调用哪个方法直到运行时才确定,然后去执行绑定的代码. 绑定的过 ...

最新文章

  1. java二级考试历年真题6_2018年3月计算机二级考试JAVA试题及答案(六)
  2. 从Firefox控制您喜欢的音乐播放器
  3. jzoj4274-终章-剑之魂【位运算,贪心】
  4. mysql5.7环境,MySQL-5.7-线上生产环境部署
  5. docker 使用中遇到的问题
  6. java dfs算法蓝桥杯题_【蓝桥杯省赛JavaB组真题详解】四平方和(2016)_疼疼蛇的博客-CSDN博客...
  7. 连Spring源码都没看过,你怎么敢在简历上写“精通”?
  8. LeetCode(700)——二叉搜索树中的搜索(JavaScript)
  9. spring 源码深度解析_spring源码解析之SpringIOC源码解析(下)
  10. 夏普 DN7C3A006 PM2.5 传感器测量步骤及存在问题
  11. TortoiseGit使用入门
  12. VS2022支持.net4.0和.net4.5SDK
  13. Google earth
  14. [译]GLUT教程 - 整合代码2
  15. 苹果:我们从未向中国政府透露源代码
  16. 因算法裁定“效率低下”,近150名员工遭解雇
  17. 用C++完成华氏温度换摄氏温度
  18. LaTex便捷插入罗马数字
  19. wordpress 迁移报错“Error establishing a database connection“
  20. Eureka注册服务配置info-使用$project.artifactId$无法动态显示artifactId

热门文章

  1. WSCRIPT与CScript区别解释
  2. 为什么机器人发展了几十年感觉还是没太大进展
  3. linux 普通用户登陆系统su - root的时候报错su: Authentication failure
  4. CSS基础学习-6.CSS属性_列表、表格
  5. java - 方法的重载
  6. 无网情况下linux安装django
  7. 《SQL查询语句4》
  8. C#简单实现读取txt文本文件并分页存储到数组
  9. 《嵌入式linux应用程序开发标准教程》笔记——7.进程控制开发
  10. 到你是你玩互联网还是互联网玩了你