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]
ステートメントに応答しないでください)。