iOS开发底层之类的底层探究-05

Posted iOS_developer_zhong

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了iOS开发底层之类的底层探究-05相关的知识,希望对你有一定的参考价值。

文章目录


一、探索类

1.通过实操观察类的结构


下面就一张经典的图,详细表明了实例对象、类、元类、根元类之间的联系。
isa的走位图
isa的元类继承链
苹果官方isa图,包含了所有isa走位情况:

结论:

  1. isa的走位: 对象isa -> 类isa -> 元类isa -> 根元类isa ->根元类。
  2. 根类isa走位: 根类isa -> 根元类isa
  3. 继承类isa走位:对象isa -> 类isa ->父类isa -> 父类元类isa -> 根元类isa ->根元类。
  4. NSObject是所有对象的根元类,他没有父类。

2. objc_class 探索 - 属性的本质

  1. 查找objc_class的源码,在objc源码中查询。

  2. 获取内存数据 bits。
    1.获得类地址,平移步长 ,得到bits。
    首先我们知道objc_class的内部结构有:
    superClass , cache , 然后就是bits, 所以我们要bits之前的成员变量的大小, superClass = 8字节,重点要计算下 chche_t 的大小。 后续补充。
    在首地址平移0x20就可以得到bits的地址。 看操作截图

  3. 看到上面的截图还不够,我们最终是需要拿到LGPerson里面的属性 name ,继续看操作。

  4. 多个属性获取方式,内存平移,或者通过数组下标方式访问。 (接上面操作)

3. objc_class 探索 - 方法的本质

  1. 有了上面获取属性的操作,下面来实现获取方法

  1. 探索下class_rw_t中的== ro()==方法,找寻成员变量
    2.1 看下ro()下的ivars方法。

    成员变量就藏在ivars里面。 上图是因为程序没有重新运行,所以没有打印出来。

二. 遗留问题?

  1. 类方法在哪儿?
    类的底层详解2有解答

以上是关于iOS开发底层之类的底层探究-05的主要内容,如果未能解决你的问题,请参考以下文章

iOS开发底层之类的底层探究下-06

iOS开发底层之类的底层Cache_t 探究 - 07

iOS开发底层之类的底层Cache_t 探究 - 07

iOS开发底层之RuntimeObjc_msgSend探究 - 08

iOS开发底层之RuntimeObjc_msgSend探究 - 08

iOS开发底层之RuntimeObjc_msgSend探究下 - 09