Почему суперкласс метакласса корневого класса не является указателем NULL?

В среде выполнения 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 (что понятно, поскольку это корневой класс, поэтому у него нет суперкласса). Однако если мы получим член isa того же корневого класса MyClass (который указывает на метакласс MyClass') и получим член super этого члена isa, это будет не указатель NULL, а указатель на MyClass (не метакласс). сорт). Разве суперкласс метакласса неметакорневого класса не должен быть указателем NULL (как суперкласс неметакорневого класса)? Поскольку это не так, то почему этого не должно быть?

Я спрашиваю об этом, потому что, как обстоят дела на самом деле, если methodX является методом экземпляра (а не методом класса) корневого класса MyClass, оператор [MyClass methodX] вызовет methodX (и это действительно так), чего не должно происходить ( опять же, поскольку methodX — это метод экземпляра, а не метод класса, поэтому он не должен отвечать на оператор [MyClass methodX]).


person LuisABOL    schedule 02.12.2012    source источник


Ответы (1)


Язык Obective-C специально решил, что объекты класса должны реагировать на методы экземпляра своего корневого класса. Это в первую очередь прагматичное решение; поскольку NSObject в основном отвечает за обработку основ того, как ObjC взаимодействует с объектами, было бы раздражающе реализовывать все дважды; один раз для объектов класса и один раз для экземпляров. Объекты класса могут быть помещены в массивы и т. д., поэтому они должны реагировать на -retain и -release так же, как экземпляры.

Подробнее об этом можно прочитать в разделе «Методы корневого класса» этого документа: https://developer.apple.com/library/ios/DOCUMENTATION/Cocoa/Conceptual/ObjectiveC/Chapters/ocObjectsClasses.html

person BJ Homer    schedule 02.12.2012