【问题标题】:Why isn't the super class of a meta class of a root class a NULL pointer?为什么根类的元类的超类不是 NULL 指针?
【发布时间】: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


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2011-08-22
      • 1970-01-01
      • 2020-05-08
      • 2021-11-11
      • 1970-01-01
      • 2016-11-08
      • 1970-01-01
      • 2016-02-17
      • 2021-10-08
      相关资源
      最近更新 更多