Cocoa with Loveより引用
すべてのオブジェクトにはクラスがあります。これは基本的なオブジェクト指向の概念ですが、Objective-C ではデータの基本的な部分でもあります。適切な場所にあるクラスへのポインターを持つデータ構造は、オブジェクトとして扱うことができます。Objective-C では、オブジェクトのクラスはそのisaポインタによって決定されます。ポインターはisa、オブジェクトのクラスを指します。
その証拠として、構造体idへのポインターとしての宣言を次に示しobjc_objectます。
typedef struct objc_object {
Class isa;
} *id;
ここで本題に入ります。とはClass?
定義を見てみましょう
Classは次のように定義されています(実際にはランタイムによって異なる場合がありますが、簡単にしましょう)
struct objc_class {
Class isa;
}
typedef struct objc_class *Class;
ご覧のとおり、 aClassにもisaポインターがあります。疑わしいほどobjc_object定義に似ているように見えますが、その理由は単純ですClass。実際にはオブジェクトです。
しかし、 a のクラスは何Classですか? これは、定義上、メタクラスです。
同じ情報源によると(あなたの質問に直接取り組む太字の部分)、
以前のメタクラスと同様に、メタクラスClassもオブジェクトです。これは、その上でメソッドを呼び出すこともできることを意味します。当然、これはクラスも持つ必要があることを意味します。
すべてのメタクラスは、基本クラスのメタクラス (Class継承階層の最上位のメタクラス) をクラスとして使用します。これは、NSObject(ほとんどのクラス) から派生するすべてのクラスについて、メタクラスがNSObjectメタクラスをそのクラスとして持つことを意味します。
すべてのメタクラスが基本クラスのメタクラスをクラスとして使用するという規則に従って、基本メタクラスはすべて独自のクラスになります (それらの isa ポインターはそれ自体を指します)。これは、NSObjectメタクラスの isa ポインターがそれ自体を指していることを意味します (これは、それ自体のインスタンスです)。
この件についてさらに読むには、Greg Parker による別の優れた説明があります。