私は(しよう)午前は、Objective-Cのを学び、私のようなフレーズを越えてくる:Objective Cの言語のキーワードですが、何それは特に」コンパイラを言うことを意味していidの意味は何ですか?
-(id) init;
そして、私はid
を理解しますポインタ型変換規則の点でid
を扱う "
id
は自動的にオブジェクトをその右側にポインタとして指定しますか?
私は(しよう)午前は、Objective-Cのを学び、私のようなフレーズを越えてくる:Objective Cの言語のキーワードですが、何それは特に」コンパイラを言うことを意味していidの意味は何ですか?
-(id) init;
そして、私はid
を理解しますポインタ型変換規則の点でid
を扱う "
id
は自動的にオブジェクトをその右側にポインタとして指定しますか?
id
は任意の型へのポインタですが、void *
と異なり、常にObjective-Cオブジェクトを指します。たとえば、タイプid
のものをNSArrayに追加できますが、それらのオブジェクトはretain
とrelease
に応答する必要があります。
コンパイラは、任意のオブジェクトを暗黙的にid
にキャストし、任意のオブジェクトにid
をキャストすることは非常にうれしいです。これはObjective-Cの他の暗黙のキャストと異なり、Cocoaのほとんどのコンテナタイプの基礎となります。
補足: 'id'の定義は 'typedef struct objc_object * id;'で、 'Objc'オブジェクトへのポインタです。 – zhongwuzw
id
は一般的なタイプです。つまり、コンパイラはのいずれかがオブジェクトとタイプされており、制限は適用されません。そこに複数のクラスのオブジェクトを使用することが予想される場合は便利です。イントロスペクションを使用して、それがどのクラスであるかを調べることができます。 id
はObjective-Cのすべてのオブジェクトがポインタ/参照として渡されるため、自動的にポインタを引き継ぎます。
いくつかの追加のリソース:
id vs NSObject vs id*
Objective-C Programming (Wikibooks)
Introspection
id
は任意のObjective-Cオブジェクト(objc_object
)へのポインタです。それは単なる無効なポインタではないので、あなたはそう扱うべきではありません。有効なisa
ポインターが必要なオブジェクトを参照します。 id
に格納できる値は、NSObject
とその子孫に限定されず、NSObject
プロトコルと、NSObject
も継承しないNSProxy
クラスの存在を理解し始めます。コンパイラでは、タイプid
によって参照されるオブジェクトを任意のオブジェクトタイプに割り当て、任意のオブジェクトタイプをid
に割り当て、警告なしでメッセージを送信することができます。
はい、いいえ。 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?
は、JavaやC#で、私たちはこの
Object data = someValue;
String name =(Object)data;
のように使用できますが、Objective Cの
id data= someValue;
NSString *name= data;
にそれは自我の反対です。いくつかの人々は 'void *'のために –
ここに質問に関連する議論があります:[SO質問](http://stackoverflow.com/questions/8972221/would-it-be-beneficial-to-begin-using-instancetype -instead-of-id/14652187#14652187) – dmitri