【发布时间】:2012-12-02 14:41:21
【问题描述】:
在 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] 语句)。
【问题讨论】:
标签: objective-c class objective-c-runtime