私はObjective-Cを学習しようとしていますが、次のようなフレーズに出くわし続けます。
-(id) init;
id
はObjective C言語のキーワードであると理解していますが、「コンパイラはid
をポインタ型変換規則に関して具体的に処理する」とはどういう意味ですか?
id
は、その右側のオブジェクトを自動的にポインターとして指定しますか?
id
は任意の型へのポインターですが、void *
とは異なり、常にObjective-Cオブジェクトを指します。たとえば、タイプid
の任意のものをNSArrayに追加できますが、それらのオブジェクトはretain
およびrelease
に応答する必要があります。
コンパイラは、オブジェクトをid
に暗黙的にキャストし、id
をオブジェクトにキャストすることを完全に喜んでいます。これは、Objective-Cの他の暗黙的なキャストとは異なり、Cocoaのほとんどのコンテナタイプの基礎です。
id
は、Objective-Cオブジェクトへのポインターです(objc_object
)。これは単なる無効なポインターではなく、そのように扱うべきではありません。有効なisa
ポインターが必要なオブジェクトを参照します。 id
に保存できる値は、NSObject
とその子孫だけに限定されず、NSObject
プロトコルと NSProxy
NSObject
からも継承しないクラス。コンパイラにより、タイプid
で参照されるオブジェクトを任意のオブジェクトタイプに割り当て、任意のオブジェクトタイプをid
に割り当てることができます。警告。
id
はジェネリック型です。これは、コンパイラーがanyobjectタイプを期待し、制限を実施しないことを意味します。そこに複数のオブジェクトクラスを使用する予定がある場合に便利です。その後、イントロスペクションを使用して、どのクラスであるかを確認できます。 Objective-Cのすべてのオブジェクトはポインター/参照として渡されるため、id
は自動的にポインターを想定します。
その他のリソース:
id vs NSObjectvs id *
Objective-C Programming(Wikibooks)
Introspection
ダイナミックタイピング
In Javaまたはc#このように使用します
Object data = someValue;
String name =(Object)data;
ただしObjective Cでは
id data= someValue;
NSString *name= data;
はいといいえ。 id x
はxをポインターとして指定しますが、「id」には特別な型変換規則があるため、ポインター型変換規則が適用されると言うのは間違っています。たとえば、void *
ポインターこれはできません:
void *x;
char *y = x; // error, this needs an explicit cast
それどころか、idで可能です:
id x;
NSString *y = x;
タイプ Objective Cの例のid の使用方法を参照してください。
さらに、「現代の」Objective Cでは、「init」メソッドで「id」の代わりにinstancetype
を使用することをお勧めします。 Xcodeにはそれを変更するための自動変換ツールさえあります。 instancetypeについて読む: idの代わりにinstancetypeを使用することは有益ですか?