阅读 228

ios-对象的原理探索八-消息快速查找

ios-对象的原理探索七

前言 

到上篇文章为止,已经完整分析了类的结构,从这篇文章开始,分析类的另一个主要的内容,类的消息转发机制**和**方法的本质

一.RunTime简介

RunTime的探索

二.探索objc_msgSend

消息的查找流程分为两种:

  1. 快速查找
  2. 慢速查找

上篇文章中分析cache_tbuckets属性,存在有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中获取,具体的流程图分析入如下: