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 メンバーを取得し、その isa メンバーのスーパー メンバーを取得する場合、それは NULL ポインターではなく、MyClass(メタ クラスではない) へのポインターです。非メタ ルート クラスのメタ クラスのスーパー クラスは、(非メタ ルート クラスのスーパー クラスのように) NULL ポインターであってはなりませんか? そうではないのに、なぜそうではないはずなのですか?
私がこれを尋ねているのは、実際にmethodXは、ルートクラスのインスタンスメソッド(クラスメソッドではない)であるMyClass場合、ステートメント[MyClass methodX]
が呼び出すmethodX(そして実際に呼び出す)、何が起こるべきではないのか(繰り返しmethodXますが、クラスメソッドではなくインスタンスメソッドであるため、[MyClass methodX]ステートメントに応答しないでください)。