cache在objc_object里面的位置:
cache_t的内部结构
cache_t存储方法的方法:
SEL 方法名
IMP方法实现
id receiver 为方法实现
存储的位置是buckets
bucket定义了存储的类型
方法的存储规则
- 如果已经存储过方法,并且方法实现一样则返回方法实现
- 如果已经存储过,方法实现不一样则,方法在bucket中的位置+1,也就是存储到下一个位置
- 如果没存储过,则存储该方法
存储方法
- 默认cache_t缓存两个方法
- 1、responseSelector
- 2、class
如果再调用第三个方法就会扩容,扩容规则:
1、初始化大小根据平台不一样,x86_64 是4 arm64 是2 2、x86_64架构下,缓存的大小(默认+1)等于筒子长度的3/4时进行2倍扩容 3、arm64架构下,缓存的大小大于筒子长度7/8时进行2倍扩容,默认长度为8时不进行扩容,指导装满 4、扩容之后旧的筒子会直接释放掉