美文网首页
Runtime-Class

Runtime-Class

作者: 磊Se | 来源:发表于2021-03-11 14:58 被阅读0次

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指针指向自己。
如下图:

相关文章

  • runtime-class

    objc_class数据结构

  • Runtime-class

    01 isMemberOfClass和isKindOfClassisMemberOfClass判断对象是不是后面的...

  • Runtime-Class

    Class的本质 objc_object 实例对象 如下代码,创建的实例对象,其实是objc_object结构体。...

  • runtime-class创建过程(第一解)

    我觉得作为一名程序员,不断去深入挖掘代码的底层实现过程,这是一件非常有意思的事情,就像福尔摩斯探案一样,层层解析,...

网友评论

      本文标题:Runtime-Class

      本文链接:https://www.haomeiwen.com/subject/sxanqltx.html