4

在 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 指针(就像非元根类的超类一样)?既然不是,那它不应该是什么?

我问这个是因为,实际上,如果methodXMyClass根类的实例方法(不是类方法),则该语句[MyClass methodX] 将调用methodX(实际上确实如此),不应该发生什么(再次,因为methodX是实例方法,而不是类方法,因此它不应该响应该[MyClass methodX]语句)。

4

1 回答 1

9

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

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

于 2012-12-02T15:24:00.307 回答