在 Objective-C 运行时,一个类由如下结构表示:
typedef struct class_t {
struct class_t *isa; // Points to the class' meta class
struct class_t *super; // Points to the class' super class
Cache cache;
IMP *vtable;
union {
class_ro_t *rodata;
class_rw_t *rwdata;
};
} class_t;
当一个MyClass
类是根类而不是元类时,它的超成员是一个NULL指针(这是可以理解的,因为它是根类,所以它没有超类)。但是,如果我们得到同一个MyClass
根类的 isa 成员(它指向MyClass
元类),并且我们得到那个 isa 成员的超级成员,它就不是一个 NULL 指针,而是一个指向MyClass
(不是元类)的指针。非元根类的元类的超类不应该是 NULL 指针(就像非元根类的超类一样)?既然不是,那它不应该是什么?
我问这个是因为,实际上,如果methodX
是MyClass
根类的实例方法(不是类方法),则该语句[MyClass methodX]
将调用methodX
(实际上确实如此),不应该发生什么(再次,因为methodX
是实例方法,而不是类方法,因此它不应该响应该[MyClass methodX]
语句)。