Runtime

293 阅读2分钟

1, arm64之后,、对 isa进行了优化,变成了一个 union共用体,共用体的意思是大家共用一块内存。

2, 掩码一般是用来按位&运算的

3, 位域,冒号后面代表所占的二进制位,第一个成员放在最右边的二进制位

4,arm64架构下, Class,meta-Class对象的地址最后 3 个二进制位永远是 0,例如(0x*******0),(0x*******8)

5.1,arm64架构下,isa_t共用体

5.2,成员的作用

6,class_rw_t里面的方法列表、属性列表、协议列表都是二维数组,存储着分类和类的所有相关信息, class_ro_t里面的方法列表、属性列表、协议列表是一维数组,只存储类的信息,ivar成员列表在class_ro_t

7,method_t是对方法/函数的封装

8, 不同类中相同名字的方法,所对应的方法选择器是相同的,地址是一样的

9, cache_t用散列表(哈希表)缓存曾经调用过的方法,一旦扩容会清掉原有的缓存(mask*2)

10,哈希表的原理f(key) == index 你把 key给我,我通过某种算法(例如按位与、取余等)得出索引值,索引冲突的话,再通过 mask减一或者加一操作再次计算索引值,空间换时间

11,sel_registerName("") == @selector()

12,消息机制,消息发送阶段

13,消息机制,动态方法解析

14,消息机制,消息转发

15,super 调用只是仅仅决定查找顺序从父类开始查找,方法接收者还是self自己 self调用方法是objc_msgSend,super的调用方法是objc_msgSendSuper

16,终极面试题 super 的本质,栈空间内存分配问题,从高到低, 访问成员变量的本质是忽略isa的八个字节,访问下面的高地址