iOS开发底层之类的底层探究-05
Posted iOS_developer_zhong
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了iOS开发底层之类的底层探究-05相关的知识,希望对你有一定的参考价值。
文章目录
一、探索类
1.通过实操观察类的结构
下面就一张经典的图,详细表明了实例对象、类、元类、根元类之间的联系。
isa的走位图
isa的元类继承链
苹果官方isa图,包含了所有isa走位情况:
结论:
- isa的走位: 对象isa -> 类isa -> 元类isa -> 根元类isa ->根元类。
- 根类isa走位: 根类isa -> 根元类isa
- 继承类isa走位:对象isa -> 类isa ->父类isa -> 父类元类isa -> 根元类isa ->根元类。
- NSObject是所有对象的根元类,他没有父类。
2. objc_class 探索 - 属性的本质
-
查找objc_class的源码,在objc源码中查询。
-
获取内存数据 bits。
1.获得类地址,平移步长 ,得到bits。
首先我们知道objc_class的内部结构有:
superClass , cache , 然后就是bits, 所以我们要bits之前的成员变量的大小, superClass = 8字节,重点要计算下 chche_t 的大小。 后续补充。
在首地址平移0x20就可以得到bits的地址。 看操作截图
-
看到上面的截图还不够,我们最终是需要拿到LGPerson里面的属性 name ,继续看操作。
-
多个属性获取方式,内存平移,或者通过数组下标方式访问。 (接上面操作)
3. objc_class 探索 - 方法的本质
- 有了上面获取属性的操作,下面来实现获取方法
- 探索下class_rw_t中的== ro()==方法,找寻成员变量。
2.1 看下ro()下的ivars方法。
成员变量就藏在ivars里面。 上图是因为程序没有重新运行,所以没有打印出来。
二. 遗留问题?
- 类方法在哪儿?
类的底层详解2有解答
以上是关于iOS开发底层之类的底层探究-05的主要内容,如果未能解决你的问题,请参考以下文章
iOS开发底层之RuntimeObjc_msgSend探究 - 08