iOS之深入解析objc_msgSend消息转发机制的底层原理
一、抛砖引玉
- objc_msgSend() 消息发送的过程就是 通过 SEL 查找 IMP 的过程 。
- objc_msgSend() 是用 汇编语言 实现的,使用汇编实现的优势是:
- 消息发送的过程需要足够的快速,高级语言在执行的时候都是需要翻译成汇编语言,经过编译成被机器识别的 二进制文件 ,使用汇编可以省去这一翻译过程,可以更快速被机器识别;
- 对于消息的发送,存在很多未知的参数,这有很多不确定性,使用 汇编的寄存器 要比 C 或者 C++ 表现好的多。
- objc_msgSend() 通过汇编 快速查找方法缓存 ,如果能找到则调用 TailCallCachedImp 直接将方法缓存起来然后进行调用,objc_msgSend() 的快速查找请参考之前的文章:iOS之深入解析Runtime的objc_msgSend“快速查找”底层原理。
- 如果在缓存中查找不到,则就跳转到 CheckMiss ,然后执行 慢速查找流程 。objc_msgSend() 的慢速查找请参考之前的文章:
iOS之深入解析objc_msgSend消息转发机制的底层原理相关推荐
- iOS之深入解析dyld与ObjC关联的底层原理
App启动与dylb加载 我们知道 dyld 的加载过程,即在 App 启动启动执行 main 函数之前,dylb 主要作了环境变量配置.共享缓存.主程序的初始化.插入动态库.链接主程序.链接动态库. ...
- iOS之深入解析内存管理Tagged Pointer的底层原理
一.前言 ① Tagged Pointer 概念 iOS 开发者对"引用计数"这个名词肯定不陌生,引用计数是苹果为了方便开发者管理内存而引入的一个概念.当引用计数为 0 时,对象就 ...
- iOS之深入解析自动释放池autoreleasepool的底层原理
一.自动释放池 autoreleasepool 原理 自动释放池是 OC 中的一种内存自动回收机制,它可以将加入 autoreleasePool 中的变量 release 的时机延迟. 简单来说,就是 ...
- iOS之深入解析类方法+load与+initialize的底层原理
一.前言 Objective-C 作为一门面向对象语言,有类和对象的概念.编译后,类相关的数据结构会保留在目标文件中,在运行时得到解析和使用.在应用程序运行起来的时候,类的信息会有加载和初始化过程. ...
- 消息转发机制与Aspects源码解析
前言 最近在搞重构相关的事情,遇到了不少这样的场景: 进入一个界面,在viewWillAppear:的时候做相应判断,如果满足条件则执行对应代码. 这类业务有一个特点,业务内容是对应整个App的,与对 ...
- iOS 消息转发机制
这篇博客的前置知识点是 OC 的消息传递机制,如果你对此还不了解,请先学习之,再来看这篇.这篇博客我尝试用口语的方式像讲述 PPT 一样给大家讲述这个知识点. 我们来思考一个问题,如果对象在收到无法解 ...
- 【iOS沉思录】Objective-C语言消息传递机制三道防线:消息转发机制详解
消息传递机制: 在OC中,方法的调用不再理解为对象调用其方法,而是要理解成对象接收消息,消息的发送采用'动态绑定'机制,具体会调用哪个方法直到运行时才能确定,确定后才会去执行绑定的代码.方法的调用实际 ...
- runtime(三) Objective-C 的消息转发机制与动态添加方法
在上上一篇博客 runtime系列(一) objc_msgSend 中介绍了运行时的消息传递机制,但是却没有说对象收到消息却无法解读该怎么办.本篇博客就着重介绍当消息传递时无法解读的时候就会启动的 消 ...
- iOS-动态方法决议与消息转发机制
在消息发送机制中我们介绍过,OC是动态语言,对象调用方法其实就是对象接收消息,而消息的发送采用"动态绑定"机制,具体会调用哪个方法直到运行时才确定,然后去执行绑定的代码. 绑定的过 ...
最新文章
- java二级考试历年真题6_2018年3月计算机二级考试JAVA试题及答案(六)
- 从Firefox控制您喜欢的音乐播放器
- jzoj4274-终章-剑之魂【位运算,贪心】
- mysql5.7环境,MySQL-5.7-线上生产环境部署
- docker 使用中遇到的问题
- java dfs算法蓝桥杯题_【蓝桥杯省赛JavaB组真题详解】四平方和(2016)_疼疼蛇的博客-CSDN博客...
- 连Spring源码都没看过,你怎么敢在简历上写“精通”?
- LeetCode(700)——二叉搜索树中的搜索(JavaScript)
- spring 源码深度解析_spring源码解析之SpringIOC源码解析(下)
- 夏普 DN7C3A006 PM2.5 传感器测量步骤及存在问题
- TortoiseGit使用入门
- VS2022支持.net4.0和.net4.5SDK
- Google earth
- [译]GLUT教程 - 整合代码2
- 苹果:我们从未向中国政府透露源代码
- 因算法裁定“效率低下”,近150名员工遭解雇
- 用C++完成华氏温度换摄氏温度
- LaTex便捷插入罗马数字
- wordpress 迁移报错“Error establishing a database connection“
- Eureka注册服务配置info-使用$project.artifactId$无法动态显示artifactId