web-dev-qa-db-ja.com

idの意味は何ですか?

私はObjective-Cを学習しようとしていますが、次のようなフレーズに出くわし続けます。

-(id) init;

idはObjective C言語のキーワードであると理解していますが、「コンパイラはidをポインタ型変換規則に関して具体的に処理する」とはどういう意味ですか?

idは、その右側のオブジェクトを自動的にポインターとして指定しますか?

83
GPP

idは任意の型へのポインターですが、void *とは異なり、常にObjective-Cオブジェクトを指します。たとえば、タイプidの任意のものをNSArrayに追加できますが、それらのオブジェクトはretainおよびreleaseに応答する必要があります。

コンパイラは、オブジェクトをidに暗黙的にキャストし、idをオブジェクトにキャストすることを完全に喜んでいます。これは、Objective-Cの他の暗黙的なキャストとは異なり、Cocoaのほとんどのコンテナタイプの基礎です。

104
joerick

idは、Objective-Cオブジェクトへのポインターです(objc_object)。これは単なる無効なポインターではなく、そのように扱うべきではありません。有効なisaポインターが必要なオブジェクトを参照します。 idに保存できる値は、NSObjectとその子孫だけに限定されず、NSObjectプロトコルと NSProxyNSObjectからも継承しないクラス。コンパイラにより、タイプidで参照されるオブジェクトを任意のオブジェクトタイプに割り当て、任意のオブジェクトタイプをidに割り当てることができます。警告。

29
Joe

idはジェネリック型です。これは、コンパイラーがanyobjectタイプを期待し、制限を実施しないことを意味します。そこに複数のオブジェクトクラスを使用する予定がある場合に便利です。その後、イントロスペクションを使用して、どのクラスであるかを確認できます。 Objective-Cのすべてのオブジェクトはポインター/参照として渡されるため、idは自動的にポインターを想定します。

その他のリソース:
id vs NSObjectvs id *
Objective-C Programming(Wikibooks)
Introspection
ダイナミックタイピング

22
FeifanZ
  • idは、Objective-Cのオブジェクト識別子のデータ型であり、どのクラスを持っているかに関係なく、任意の型のオブジェクトに使用できます。 idは、すべてのオブジェクトの最終的なスーパータイプです。

In Javaまたはc#このように使用します

 Object data = someValue;


 String name =(Object)data;

ただしObjective Cでは

id data= someValue;



NSString *name= data;
8
user7538321

はいといいえ。 id xはxをポインターとして指定しますが、「id」には特別な型変換規則があるため、ポインター型変換規則が適用されると言うのは間違っています。たとえば、void *ポインターこれはできません:

void *x;
char *y = x; // error, this needs an explicit cast

それどころか、idで可能です:

id x;
NSString *y = x;

タイプ Objective Cの例のid の使用方法を参照してください。

さらに、「現代の」Objective Cでは、「init」メソッドで「id」の代わりにinstancetypeを使用することをお勧めします。 Xcodeにはそれを変更するための自動変換ツールさえあります。 instancetypeについて読む: idの代わりにinstancetypeを使用することは有益ですか?

5
battlmonstr