В среде выполнения 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]
).