Runtime-类对象、实例、元类

2019/7/1 posted in  Objective-C

类对象(objc_class)

Objcetive-C类是由Class类型来表示的,它实际上是指向objc_class结构体的指针。

typedef struct objc_class *Class;

objc_class结构体定义如下:

struct objc_class {
    Class _Nonnull isa  OBJC_ISA_AVAILABILITY;

#if !__OBJC2__
    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;
    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;

类对象就是一个结构体struct objc_class,这个结构体存放的数据称为元数据,编译期用于创建实例对象,是单例。

实例(objc_object)

struct objc_object {
    // 实例的isa指针指向类对象
    Class _Nonnull isa  OBJC_ISA_AVAILABILITY;
};

/// id类型是指向objc_object结构体的指针
typedef struct objc_object *id;

元类(meta-class)

  • 元类是Class的类,结构和objc_class一样,只是存储的数据不一样。
  • 所有类方法都存储在元类当中
  • NSObject是根类,NSObject的元类叫根元类
  • 根元类的isa指针指向自己

三者关系

// 创建类
@interface Student : NSObject
@end
// 创建实例
Student *xiaoming = [Student new];
  1. 实例xiaomingisa指针指向Student
  2. Student类的isa指针指向Student MetaClass
  3. Student MetaClassisa指针指向NSObject MetaClass
  4. NSObject MetaClassisa指针指向自己