根据我之前写的关于iOS 实例对象的本质,可以知道,实例化对象的本质是包含
isa
指针和成员变量的结构体,
struct NSObject_IMPL {
Class isa;
};
818版本源码中,类的数据结构如下所示
// class为objc_class *类型的结构体
typedef struct objc_class *Class;
struct objc_object {
isa_t isa; // Class isa
}
struct objc_class : objc_object {
......
// 包含Class isa;
Class superclass;
cache_t cache; // 方法缓存
class_data_bits_t bits; // & FAST_DATA_MASK之后,在class_rw_t *中获取类的具体信息
......
}
简化后为:
struct objc_class {
isa_t isa;
Class superclass;
cache_t cache; // 方法缓存
class_data_bits_t bits; // & FAST_DATA_MASK之后,在class_rw_t *中获取类的具体信息
}
我们知道实例对象包含isa
指针,现在我们发现类的数据结构中包含isa
和superclass
,其中isa
指针的指向是平级(经过& ISA_MASK
位运算之后),既:subClass
的实例对象的isa
指针,指向subClass
类,subClass
类的isa
指向subClass
元类
subClass
类的superclass
指针,指向其父类supClass
,supClass
类的isa
指向NSObject
关于isa
指针
当调用对象方法时,实例对象的isa
指向类,通过实例对象的isa
找到class
,最后找到对象方法的实现进行调用
当调用类方法时,类的isa
指向meta-class
(元类),通过类的isa
找到meta-class
(元类),最后找到类方法的实现进行调用
关于superclass
指针
当subClass
的实例对象要调用supClass
的对象方法时,会先通过isa
找到subClass
,然后通过superclass
找到supClass
,最后找到对象方法的实现进行调用
当subClass
类要调用supClass
的类方法时,会先通过isa
找到subClass
的meta-class
(元类),然后通过superclass
找到supClass
的meta-class
(元类),最后找到类方法的实现进行调用