iOS 底层探索篇 —— Cache分析
Cache底层分析
cache结构猜测
之前我们在获取bits的时候,是通过内存平移,那么我们获取cache
,也可以通过内存平移。
isa
和 superclass
都是8
位,所以需要平移16
位才能获得cache。
我们在lldb中得到LGPerson
类的地址,然后平移16位
,并将其转为cache_t *
类型,然后将里面的内容打印出来。
这里我们就获得了cache_t
的数据。
对比一下在源码里的结构,证明确实是cache_t的数据。在这里我们不知道到底哪个才是我们想要的数据,所以我们可以去看一下结构里的方法,看看对哪个数据进行增删改查。
我们发现,结构体里面的方法,大部分是对 bucket_t
进行操作的,我们再点进去bucket_t。
发现里面装着imp
和sel
。
LLDB证明cache结构
我们来找一下,哪里可以获取到bucket_t
.
我们用之前拿到的cache_t
,输出_bucketsAndMaybeMask
我们发现我们无法获得里面的值。我们换个目标,到_maybeMask
里面试试。
发现依然不是我们想要的。我们再换个目标,到_originalPreoptCache
里面试试。
发现_originalPreoptCache
也不是我们想要的数据,那么我们就转移方向,去方法
那里寻找。
我们在结构体方法中发现buckets()
这个方法,并且返回struct bucket_t 指针,我们来验证一下。
我们发现,虽然sel,imp
的值是空
,但是确实是我们想要的数据。为什么这里的sel,imp是为空呢?因为这里是缓存
区,我们需要先调用
方法,才会把方法缓存到缓存区。我们执行
一下saySomething方法。
然后在重新获取一遍数据。