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 指针指向了它自己。
所有的元类都使用根元类作为他们的类。这就意味着所有NSObject的子类(大多数类)的元类都会以NSObject的元类作为他们的类,根元类的 isa 指针指向了它自己。
三、isa指针
isa 指针,表示这个对象是一个什么类。而 Class 类型, 也就是 struct objc_class * ,这是苹果在下面的注释中写到的。这说明类本身也是一个对象。在类对象中的 isa 指向的类叫做“元类”,类方法就定义在元类中。总的来说就是,一个类可以有很多的实例,这些实例有着唯一的一个类对象,而这个类对象也有着唯一的一个元类。