私はObjective-Cを学びたいと思っており、次のようなフレーズに遭遇し続けます。
-(id) init;
そして、私idはObjective C言語のキーワードであると理解していますが、「コンパイラーidがポインター型変換規則の観点から具体的に処理する」とはどういう意味ですか?
id自動的にポインタとしてその右にあるオブジェクトを指定?
私はObjective-Cを学びたいと思っており、次のようなフレーズに遭遇し続けます。
-(id) init;
そして、私idはObjective C言語のキーワードであると理解していますが、「コンパイラーidがポインター型変換規則の観点から具体的に処理する」とはどういう意味ですか?
id自動的にポインタとしてその右にあるオブジェクトを指定?
回答:
idは任意の型へのポインタですが、void *常にObjective-Cオブジェクトを指すとは異なります。たとえばid、NSArray にタイプの任意のものを追加できますが、それらのオブジェクトはretainおよびに応答する必要がありreleaseます。
コンパイラはid、任意のオブジェクトを暗黙的ににキャストしたり、任意のオブジェクトにキャストしたりするのに完全に満足していidます。これは、Objective-Cの他の暗黙のキャストとは異なり、Cocoaのほとんどのコンテナータイプの基本です。
id の定義はtypedef struct objc_object *id;なので、Objcオブジェクトへのポインタです。
NSObjectですか?手段、私は置き換えることができidてNSObject、それは戻り値の型だとき?
idObjective-Cオブジェクト(objc_object)へのポインタです。これは単なる無効なポインタではなく、そのように扱うべきではありません。有効なisaポインタが必要なオブジェクトを参照しています。に格納できる値idもNSObject、その子孫に限定さNSObjectれず、プロトコルの存在や、NSProxyから継承しないクラスの存在を理解し始めますNSObject。コンパイラーを使用すると、タイプによって参照されるオブジェクトidを任意のオブジェクトタイプに割り当てたり、任意のオブジェクトタイプをに割り当てたりid、警告なしに(コンパイラーが認識した)メッセージを送信したりできます。
idジェネリック型です。コンパイラが期待されますことを、この手段の任意 のオブジェクトがあっ入力して、制限を適用しません。そこで複数のクラスのオブジェクトを使用することを期待している場合に役立ちます。その後、イントロスペクションを使用して、それがどのクラスかを確認できます。idObjective-Cのすべてのオブジェクトはポインター/参照として渡されるため、自動的にポインターを想定します。
その他の
参考資料:id vs NSObject vs id *
Objective-Cプログラミング(Wikibooks)
イントロスペクション
ダイナミックタイピング
はいといいえ。id xxをポインターとして指定していることは事実ですが、「id」には特別な型変換規則があるため、ポインター型変換規則が適用されるというのは誤りです。たとえば、void *ポインタではこれを行うことはできません:
void *x;
char *y = x; // error, this needs an explicit cast
逆に、それはidで可能です:
id x;
NSString *y = x;
さらに、「モダン」Objective C instancetypeでは、「init」メソッドで「id」の代わりに使用することが推奨されています。Xcodeには、それを変更するための自動変換ツールさえあります。instancetypeについて読む:idの代わりにinstancetypeの使用を開始することは有益ですか?
void*