为什么根类的元类的超类不是NULL指针?

时间:2012-12-02 14:41:21

标签: objective-c class objective-c-runtime

在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根类(指向MyClass'元类)的isa成员,并且我们获得该成员的超级成员,则它不是NULL指针,但指向MyClass(不是元类)的指针。非元根类的元类的超类不应该是NULL指针(作为非元根类的超类)吗? 既然不是,那应该是什么呢?

我问这个是因为,实际上,如果methodXMyClass根类的实例方法(不是类方法),那么语句[MyClass methodX] 会调用methodX(它实际上是这样),不应该发生什么(同样,因为methodX是实例方法,而不是类方法,所以它不应该响应[MyClass methodX]语句)。

1 个答案:

答案 0 :(得分:8)

Obective-C语言特别决定了类对象应该响应其根类的实例方法。这主要是一个务实的决定;因为NSObject主要负责处理ObjC如何与对象交互的基础,所以必须两次实现所有内容会很烦人;一次用于类对象,一次用于实例。类对象可以放入数组等,因此它们需要像实例一样响应-retain-release

您可以在本文档的“根类的方法”部分中阅读有关它的更多信息:https://developer.apple.com/library/ios/DOCUMENTATION/Cocoa/Conceptual/ObjectiveC/Chapters/ocObjectsClasses.html