idの意味は何ですか?


97

私はObjective-Cを学びたいと思っており、次のようなフレーズに遭遇し続けます。

-(id) init;

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

id自動的にポインタとしてその右にあるオブジェクトを指定?


28
それは自我の反対です。一部の人のためにvoid*
Hot Licks

質問に関連するディスカッションは
次のとおりです。SO

回答:


122

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

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


11
補足:id の定義はtypedef struct objc_object *id;なので、Objcオブジェクトへのポインタです。
zhongwuzw

それは同じNSObjectですか?手段、私は置き換えることができidNSObject、それは戻り値の型だとき?
ThunderWiring 2018年

アップルのドキュメント:developer.apple.com/documentation/objectivec/id
language

33

idObjective-Cオブジェクト(objc_object)へのポインタです。これは単なる無効なポインタではなく、そのように扱うべきではありません。有効なisaポインタが必要なオブジェクトを参照しています。に格納できる値idNSObject、その子孫に限定さNSObjectれず、プロトコルの存在や、NSProxyから継承しないクラスの存在を理解し始めますNSObject。コンパイラーを使用すると、タイプによって参照されるオブジェクトidを任意のオブジェクトタイプに割り当てたり、任意のオブジェクトタイプをに割り当てたりid、警告なしに(コンパイラーが認識した)メッセージを送信したりできます。


25

idジェネリック型です。コンパイラが期待されますことを、この手段の任意 のオブジェクトがあっ入力して、制限を適用しません。そこで複数のクラスのオブジェクトを使用することを期待している場合に役立ちます。その後、イントロスペクションを使用して、それがどのクラスかを確認できます。idObjective-Cのすべてのオブジェクトはポインター/参照として渡されるため、自動的にポインターを想定します。

その他の
参考資料:id vs NSObject vs id *
Objective-Cプログラミング(Wikibooks)
イントロスペクション
ダイナミックタイピング


9
  • idはObjective-Cのオブジェクト識別子のデータ型であり、どのクラスのオブジェクトでも使用できます。 idは、すべてのオブジェクトの最後のスーパータイプです。

javaまたはc#では、次のように使用します

 Object data = someValue;


 String name =(Object)data;

しかし、目的c

id data= someValue;



NSString *name= data;

5

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

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

逆に、それはidで可能です:

id x;
NSString *y = x;

目的cの例で、タイプidの使用方法を確認してください。

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.