6

Objective-Cidタイプについての私の理解は、それが未知のタイプのオブジェクトへのポインターであるということです。私の目には、Objective-Cクラスのvoid *のようなもので、型チェックなどのコンパイラーシュガーが上にあります。私の質問は、それがポインタ型であるため、なぜそれがid*その代わりではないのかということです。idこれがJavaまたはC#であり、オブジェクト参照がを使用して宣言されていない場合*、私はそれほど驚かないでしょう。しかし、Objective-Cでは、すべてのクラスがCスタイルのポインターによって参照されているのに、なぜ*未知のオブジェクトタイプのを非表示にするのでしょうか。

4

1 に答える 1

11

id typedefすでにポインタです:

typedef struct objc_object {
    Class isa;
} *id;

Objective-Cプログラミング言語から:

Objective-Cでは、オブジェクト識別子は異なるデータ型ですid。このタイプは、クラスに関係なく、あらゆる種類のオブジェクトの一般的なタイプであり、クラスのインスタンスおよびクラスオブジェクト自体に使用できます。

id anObject;

メソッドの戻り値など、Objective-Cのオブジェクト指向構造の場合、デフォルトのデータ型としてidがintに置き換わります。(関数の戻り値など、厳密にC構造の場合、intはデフォルトの型のままです。)

キーワードnilは、nullオブジェクト、値が0のidとして定義されます。id、nil、およびその他の基本的なタイプのObjective-Cは、ヘッダーファイルobjc/objc.hで定義されます。

idは、オブジェクトデータ構造へのポインタとして定義されています。

typedef struct objc_object {
    Class isa;
} *id;

したがって、すべてのオブジェクトには、それがインスタンスであるクラスを通知するisa変数があります。クラスタイプ自体がポインタとして定義されているため、次のようになります。

typedef struct objc_class *Class;

このisa変数は、「isaポインタ」と呼ばれることがよくあります。</ p>

于 2012-09-28T11:26:18.777 に答える