前言
到上篇文章为止,已经完整分析了类的结构,从这篇文章开始,分析类的另一个主要的内容,类的消息转发机制**和**方法的本质
一.RunTime简介
二.探索objc_msgSend
消息的查找流程分为两种:
- 快速查找
- 慢速查找
上篇文章中分析cache_t的buckets属性,存在有buckt_t结构体,其中有两个元素_sel和_imp,它的作用就是缓存方法名称和方法地址,让类快速的进行消息转发,那么问题来了obje_msgSend是如何从cache_t中读取的_sel和_imp的,下面就分析下msgSend的汇编源码
说明:
msgSend采用汇编来实现
实现的原因就是汇编更容易能被机器识别,总结一个字就是**
快**
搜索_objc_msgSend源码
只看arm64版本,这里不多做解释**s**文件以前的文章中有提到过,代表汇编语言
打开arm64版本,找到汇编的方法入口:
汇编源码分析
知识点:
ENTRY 入口
CMP 比较.(两**作数作减法,仅修改标志位,不回送结果).
LDR 获取手指针地址
MOV 移动
LSR存储目标偏移后的指针
B 返回
BL 跳转
可参考《汇编指令》
ENTRY _objc_msgSend
CacheLookup
实现:
继续分析
CheckMiss
查找__objc_msgSend_uncached
MethodTableLookup实现
到这个位置,消息的快速查找流程就结束了
总结
objct_msgSend的实现是通过汇编语言实现的,目的是快速的定位类的方法,其查找的位置是在类结构体中的cate_t中获取,具体的流程图分析入如下: