私は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
、それは戻り値の型だとき?
id
Objective-Cオブジェクト(objc_object
)へのポインタです。これは単なる無効なポインタではなく、そのように扱うべきではありません。有効なisa
ポインタが必要なオブジェクトを参照しています。に格納できる値id
もNSObject
、その子孫に限定さNSObject
れず、プロトコルの存在や、NSProxy
から継承しないクラスの存在を理解し始めますNSObject
。コンパイラーを使用すると、タイプによって参照されるオブジェクトid
を任意のオブジェクトタイプに割り当てたり、任意のオブジェクトタイプをに割り当てたりid
、警告なしに(コンパイラーが認識した)メッセージを送信したりできます。
id
ジェネリック型です。コンパイラが期待されますことを、この手段の任意 のオブジェクトがあっ入力して、制限を適用しません。そこで複数のクラスのオブジェクトを使用することを期待している場合に役立ちます。その後、イントロスペクションを使用して、それがどのクラスかを確認できます。id
Objective-Cのすべてのオブジェクトはポインター/参照として渡されるため、自動的にポインターを想定します。
その他の
参考資料:id vs NSObject vs id *
Objective-Cプログラミング(Wikibooks)
イントロスペクション
ダイナミックタイピング
はいといいえ。id x
xをポインターとして指定していることは事実ですが、「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*