类的底层探索

75 阅读1分钟

前言

本文的主要目的是分析 & 类的结构,整篇都是围绕一个类展开的一些探索

类的结构

  • isa
  • superclass
  • cache
    • 缓存方法
  • bits
    • 成员变量
    • 属性
    • 方法
    • 协议

image.png

isa走位 & 继承关系 图

image.png

探索过程

  • 获取类的地址 (x/p LGPerson.class)
  • LLDB 调试只能看到类中有一个isa,查看源码会发现有继承objc_object 的isa 、Class superclass 、cache_t cache、class_data_bits_t bits
  • 获取通过内存偏移可以获取到 cache_t 和 class_data_bits_t
  • 偏移16个字节可以拿到 cache_t
  • 偏移32个字节可以拿到 class_data_bits_t
  • class_data_bits_t 的结构中有一个class_rw_t 里面存着属性、成员变量、对象方法, 这些都是通过方法去获取到的
  class_data_bits_t->data()     p *$x   p $x.properties()   p $x.list      p $x.ptr   p $x.get(0)  
  class_data_bits_t->data()     p *$x   p $x.methods()   p $x.list      p $x.ptr   p *$x      p $x.get(0).big()
  class_data_bits_t->data()     p *$x   p $x.methods()   p $x.list      p $x.ptr   p *$x      p $x.get(0).big()
  class_data_bits_t->data()    p $2.protocols()    p $3.list  p $4.ptr  p *$5   p/x $6.list[0]   p (protocol_t *)0x0000000100008818   p $13.mangledName
  • 类方法存着在元类里面
  • cache_t 缓存方法, 待更新...