iOS底层探索之Runtime(三): lookUpImpOrForward慢速查找分析
1. 回顾
iOS底层探索之Runtime(一):运行时&方法的本质
iOS底层探索之Runtime(二): objc_msgSend&汇编快速查找分析
在前面的文章中介绍了消息发送(objc_msgSend
)流程,主要是汇编快速查找cache
的过程,并对汇编源码进行了分析,本章内容主要分析慢速查找_lookUpImpOrForward
流程。
2. _lookUpImpOrForward
在汇编的快速查找没有找到缓存,就会进入__objc_msgSend_uncached
,在__objc_msgSend_uncached
里面最主要的是对MethodTableLookup
的处理。
2.1 MethodTableLookup
x0
寄存器里面存的是imp
,并赋值给x17
,x0
是第一个寄存器也是返回值的存储位置,如果imp
在x0
里面,必将做一件事情,就是返回,那么结果一定是在bl _lookUpImpOrForward
执行后的返回值里面,也就是我们要找的imp
存储的地方,所以接下来的重点就是_lookUpImpOrForward
。bl
:b
是跳转,l
是链接寄存器,将下一条指令的地址保存到lr
寄存器中,也就是把(mov x17, x0)
的指令地址保存在lr
中,当_lookUpImpOrForwar
执行完以后,执行lr
寄存器中的地址。_lookUpImpOrForward
找到imp
赋值给x17
寄存器
_lookUpImpOrForward
在源码里面没有找到汇编的实现,因为_lookUpImpOrForward
不是汇编写的,是C++
写的,所以去掉下划线就可以搜索iOS底层探索之Runtime(三): lookUpImpOrForward慢速查找分析相关推荐
- iOS之深入解析Runtime的objc_msgSend“慢速查找”底层原理
CacheLookup 快速查找 objc_msgSend 通过汇编 快速查找方法缓存 ,如果能找到则调用 TailCallCachedImp 直接将方法缓存起来然后进行调用,如果查找不到就跳到 Ch ...
- iOS 底层探索 - 消息转发
一.动态方法解析流程分析 我们在上一章<消息查找>分析到了动态方法解析,为了更好的掌握具体的流程,我们接下来直接进行源码追踪. 我们先来到 _class_resolveMethod 方法, ...
- iOS底层探索二(OC 中 alloc 方法 初探)
前言 相关文章: iOS底层探索一(底层探索方法) iOS底层探索三(内存对齐与calloc分析) iOS底层探索四(isa初探-联合体,位域,内存优化) iOS底层探索五(isa与类的关系) iOS ...
- iOS底层探索(二) - 写给小白看的Clang编译过程原理
iOS底层探索(一) - 从零开始认识Clang与LLVM 写在前面 编译器是属于底层知识,在日常开发中少有涉及,但在我的印象中,越接近底层是越需要编程基本功,也是越复杂的.但要想提升技术却始终绕不开 ...
- iOS 底层探索篇 —— KVC 底层原理
iOS 底层探索篇 -- KVC 底层原理 1. Method Swizzling的坑与应用 1.1 method-swizzling 是什么? 1.2 坑点 坑点1:method-swizzling ...
- app启动页数秒加载 代码_iOS 底层探索 - 应用加载
一.前导知识 以下参考自 WWDC 2016 Optimizing App Startup Time : 1.1 Mach-O Mach-O is a bunch of file types for ...
- 【iOS底层】11:消息转发
一.msgSend消息发送监听 在探索了很多次了lookUpImpOrForward方法中,查找完成后会写入cache 在写入cache中发现有个打印log的操作 我们来看下是否可以通过这个输出到本地 ...
- iOS运行时-使用Runtime向Category中添加属性以及运行时介绍
前言 了解OC的都应该知道,在一般情况下,我们是不能向Category中添加属性的,只能添加方法,但有些情况向,我们确实需要向Category中添加属性,而且很多系统的API也有一些在Category ...
- iOS 开发:『Runtime』详解(二)Method Swizzling
本文用来介绍 iOS 开发中『Runtime』中的黑魔法Method Swizzling. 通过本文,您将了解到: Method Swizzling(动态方法交换)简介 Method Swizzlin ...
- iOS底层开发消息发送与转发流程
iOS底层开发消息转发流程 一,cache缓存读取流程分析 首先我们上一章已经了解到对应的cache_t的数据结构 _bucketsAndMaybeMask:指针类型,存放buckets的首地址 _m ...
最新文章
- 字节腾讯阿里罕见联手:发布直播技术新标准,要让手机直播像电视一样丝滑...
- libvirt-adabddad
- 2017年 1月 15日 指针 学习整理
- Git commit your changes or stash them before you can merge
- 正则表达式的固化分组
- 本地存储之sessionStorage
- django调用java_07.手把手教将深度学习利用Django将模型发布成服务供java调用
- Windows 下音频数据采集和播放
- Jeecg-P3 1.0版本发布,JAVA插件开发框架
- Eclipse安装UML 插件
- python函数定义及调用-Python函数及变量的定义和使用
- SPSS 的安装与概貌-第一章
- python控制EnergyPlus方法(linux)
- python爬取豆瓣书评排行榜_爬虫:爬取豆瓣读书排行榜
- Simon‘s writting 全网最全笔记
- mac mini 开发android,Mac mini M1上成功启动Ubuntu
- dw打开html不显示表格,利用Dreamweaver处理网页表格方法
- 1.22-1.23板卡调试日志
- [转载] 怎样应对一般的面试---Star 法则 - towerman
- es java 查询为空和非空的数据
热门文章