iOS OC 中的对象、 类 和 元类

一、对象的结构体

typedef struct objc_object {
    Class isa;
} *id;

isa 指针:这个指针指向他所属的类。

这个对象的isa指针指向他的类。

二、类的结构体

typedef struct objc_class *Class;
struct objc_class {
        Class isa  OBJC_ISA_AVAILABILITY;
        #if !__OBJC2__
        Class super_class                       OBJC2_UNAVAILABLE;  // 父类
        const char *name                        OBJC2_UNAVAILABLE;  // 类名
        long version                            OBJC2_UNAVAILABLE;  // 类的版本信息,默认为0
        long info                               OBJC2_UNAVAILABLE;  // 类信息,供运行期使用的一些位标识
        long instance_size                      OBJC2_UNAVAILABLE;  // 该类的实例变量大小
        struct objc_ivar_list *ivars            OBJC2_UNAVAILABLE;  // 该类的成员变量列表
        struct objc_method_list **methodLists   OBJC2_UNAVAILABLE;  // 方法定义的列表
        struct objc_cache *cache                OBJC2_UNAVAILABLE;  // 方法缓存
        struct objc_protocol_list *protocols    OBJC2_UNAVAILABLE;  // 协议链表
        #endif
} OBJC2_UNAVAILABLE;

这个类的结构体,里面也有isa指针。实质上,OC中一切都是对象,这个类含有isa指针,所以,类也是一种对象

那么类的isa指针指向哪里呢?类的isa指针指向该类的元类(MetaClass)。所以,元类就是类所属的类。

当你给对象发送消息时,消息是在寻找这个对象的类的方法列表。
当你给类发消息时,消息是在寻找这个类的元类的方法列表。

 

 

既然元类是个类,和之前的类一样也是一个对象,那元类的类是什么呢?
所有的元类都使用根元类作为他们的类。这就意味着所有NSObject的子类(大多数类)的元类都会以NSObject的元类作为他们的类,根元类的 isa 指针指向了它自己。

三、isa指针

isa 指针,表示这个对象是一个什么类。而 Class 类型, 也就是 struct objc_class * ,这是苹果在下面的注释中写到的。这说明类本身也是一个对象。在类对象中的 isa 指向的类叫做“元类”,类方法就定义在元类中。总的来说就是,一个类可以有很多的实例,这些实例有着唯一的一个类对象,而这个类对象也有着唯一的一个元类。

 

 

 

posted @ 2023-01-10 13:55  蜗牛叔叔  阅读(317)  评论(0编辑  收藏  举报