OC对象的三种分类

object-c中的对象主要分为3种:

  • instance对象(实例对象)
  • class对象(类对象)
  • meta-class对象(元类对象)

instance对象

  • instance对象就是通过类alloc出来的对象,每次调用alloc都会产生新的instance对象
  • 内存中存储着:
  • isa指针
  • 其他成员变量

class对象

  • 每个类对象在内存中有且只有一个class对象

  • 内存中存储着:
    OC对象的三种分类

  • isa指针

  • superclass指针

  • 类的属性信息(@property)、类的对象方法信息(instance > * method)

  • 类的协议信息(protocol)、类的成员变量信息(ivar)

  • 其他成员变量

meta-class对象

  • 即类对象的isa所指向的对象,每个类在内存中有且只有一个meta-class对象

  • meta-class对象和class对象的内存结构是一样的,但是用途不一样

  • 通过 object_getclass可获取到元类对象

  • 内存中存储着:
    OC对象的三种分类

  • isa指针

  • superclass指针

  • 类的属性信息(@property)、类的对象方法信息(instance > * method)

  • 类的协议信息(protocol)、类的成员变量信息(ivar)

  • 其他成员变量

三种对象的isa和superclass指针之间的关系

  • isa指针
    OC对象的三种分类
  • class对象的superclass指针
    OC对象的三种分类
  • meta-class对象的superclass指针
    OC对象的三种分类
    总 结 总结 总结
    OC对象的三种分类

class结构

从底层来看,class和meta-class都是objc_class结构

struct objc_class  {
    Class ISA;
    Class superclass;
    cache_t cache;             // 方法缓存
    class_data_bits_t bits;    // 类的具体信息,想要&FAST_DATA_MASK才能获取到正确的地址
    ...
};

class_data_bits_t结构大体:

struct class_data_bits_t {
    class_rw_t* data; //存储类的信息
    ...
}

class_rw_t大体结构:

struct class_rw_t { 
    uint32_t flags;
    uint16_t witness;
    explicit_atomic<uintptr_t> ro_or_rw_ext;
    Class firstSubclass;
    Class nextSiblingClass;
    using ro_or_rw_ext_t = objc::PointerUnion<const class_ro_t *, class_rw_ext_t *>;
    const ro_or_rw_ext_t get_ro_or_rwe();
    const class_ro_t *ro();
    const method_array_t methods();         //方法列表
    const property_array_t properties();    //属性列表
    const protocol_array_t protocols();     //协议列表
    ...
};

其中ro结构体为:

struct class_ro_t {
    uint32_t flags;
    uint32_t instanceStart;
    uint32_t instanceSize;			 //实例创建出来的占用的空间大小
#ifdef __LP64__
    uint32_t reserved;
#endif
    const uint8_t * ivarLayout;
    const char * name;                //类名
    method_list_t * baseMethodList;
    protocol_list_t * baseProtocols;
    const ivar_list_t * ivars;
    const uint8_t * weakIvarLayout;
    property_list_t *baseProperties;
    ...
};

小细节:define ISA_MASK 0x0000000ffffffff8ULL可以发现isa指向的类或者元类对象的地址,最后三位都是0

原 文 链 接 : h t t p s : / / j u e j i n . c n / p o s t / 6895921854821695496 原文链接:https://juejin.cn/post/6895921854821695496 原文链接:https://juejin.cn/post/6895921854821695496

上一篇:OpenCore版本升级实例-0.6.3升级至0.6.4


下一篇:Swift编译慢?请看这里,全套开源