Runtime-Class

2021-03-11  本文已影响0人  磊Se

Class的本质

objc_object 实例对象

如下代码,创建的实例对象,其实是objc_object结构体。Runtime会通过结构体里面的isa指针找到对应的Class。

  //实例对象
struct objc_object {
    //指向当前类结构体(objc_class)
    Class isa  OBJC_ISA_AVAILABILITY;
};

objc_class 类

类结构体(objc_class)的作用就是实例对象(objc_object)调用的实例方法和实例属性都会在这里。如下类结构体的代码结构;

//类
struct objc_class {
    //指向元类(MetaClass),类型也是 objc_class(主要存放对应的类属性和方法)
    Class _Nonnull isa  OBJC_ISA_AVAILABILITY;

#if !__OBJC2__
    //指向父类(objc_class)
    Class _Nullable super_class                              OBJC2_UNAVAILABLE;
    //类名
    const char * _Nonnull name                               OBJC2_UNAVAILABLE;
    //版本号
    long version                                             OBJC2_UNAVAILABLE;
    long info                                                OBJC2_UNAVAILABLE;
    //实例对象大小
    long instance_size                                       OBJC2_UNAVAILABLE;
    //变量列表(Category不支持添加变量)
    struct objc_ivar_list * _Nullable ivars                  OBJC2_UNAVAILABLE;
    //方法列表(指针的指针)
    struct objc_method_list * _Nullable * _Nullable methodLists                    OBJC2_UNAVAILABLE;
    //方法缓存列表(调用过的方法会缓存起来方便下次快速调用)
    struct objc_cache * _Nonnull cache                       OBJC2_UNAVAILABLE;
    //遵守的协议列表
    struct objc_protocol_list * _Nullable protocols          OBJC2_UNAVAILABLE;
#endif

} OBJC2_UNAVAILABLE;

Meta Class 元类

objc_class类里的isa指针指向的是Meta Class(元类),而Meta Class其实本质上也是对应的objc_class结构体。不过Meta Class存储的属性和方法都是类方法和类成员属性。
每个Class的Meta Class中 isa指针指向NSObject的Meta Class(即指向根类的的元类)。
NSObject(根类)的元类的isa指针指向自己。
如下图:

上一篇 下一篇

猜你喜欢

热点阅读