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 による別の優れた説明があります。