4

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

4

1 に答える 1

9

Obective-C 言語は、クラス オブジェクトがルート クラスのインスタンス メソッドに応答する必要があることを明確に決定しました。これは主に実用的な決定です。NSObject は、ObjC がオブジェクトと対話する方法の基本的な処理を主に担当しているため、すべてを 2 回実装する必要があるのは面倒です。1 回はクラス オブジェクト用、もう 1 回はインスタンス用です。クラスオブジェクトは配列などに入れることができるので、インスタンス-retainと同じように応答する必要があります。-release

詳細については、このドキュメントの「ルート クラスのメソッド」セクションを参照してください: https://developer.apple.com/library/ios/DOCUMENTATION/Cocoa/Conceptual/ObjectiveC/Chapters/ocObjectsClasses.html

于 2012-12-02T15:24:00.307 に答える