2011-11-02 18 views
63

私は(しよう)午前は、Objective-Cのを学び、私のようなフレーズを越えてくる:Objective Cの言語のキーワードですが、何それは特に」コンパイラを言うことを意味していidの意味は何ですか?

-(id) init; 

そして、私はidを理解しますポインタ型変換規則の点でidを扱う "

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

+20

にそれは自我の反対です。いくつかの人々は 'void *'のために –

+0

ここに質問に関連する議論があります:[SO質問](http://stackoverflow.com/questions/8972221/would-it-be-beneficial-to-begin-using-instancetype -instead-of-id/14652187#14652187) – dmitri

答えて

79

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

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

+0

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

17

idは一般的なタイプです。つまり、コンパイラはのいずれかがオブジェクトとタイプされており、制限は適用されません。そこに複数のクラスのオブジェクトを使用することが予想される場合は便利です。イントロスペクションを使用して、それがどのクラスであるかを調べることができます。 idはObjective-Cのすべてのオブジェクトがポインタ/参照として渡されるため、自動的にポインタを引き継ぎます。

いくつかの追加のリソース:
id vs NSObject vs id*
Objective-C Programming (Wikibooks)
Introspection

Dynamic Typing
26

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

4

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

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

を逆に、それはIDを持つことが可能です:

id x; 
NSString *y = x; 

はタイプid in objective c examplesのより多くの使用を参照してください。

"現代的"なObjective Cでは、 "init"メソッドで "id"の代わりにinstancetypeを使用することをお勧めします。それを変更するためのXcodeには自動変換ツールもあります。 はinstancetypeについての記事を読む:Would it be beneficial to begin using instancetype instead of id?

3
  • は、「ID」が 関係なく、それは持っていないどのようなクラスの任意の型のオブジェクトのために使用することはできませんのObjective-Cのオブジェクト識別子のデータ型です。 "id"はすべてのオブジェクトの最後のスーパータイプです。

は、JavaやC#で、私たちはこの

Object data = someValue; 


String name =(Object)data; 

のように使用できますが、Objective Cの

id data= someValue; 



NSString *name= data; 
関連する問題