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
的八个字节,访问下面的高地址