次の例に示されている奇妙な動作に悩まされています。
NSMutableArray *a1 = [[NSMutableArray alloc] init]; // fine
NSMutableArray *a2 = [NSMutableArray array]; // fine, too
// compiler reports incompatible pointer types; good:
NSMutableArray *a3 = [[NSArray alloc] init];
// compiler says nothing and is happy to assign this!
NSMutableArray *a4 = [NSArray array];
とクラスの両方のinitとarrayメソッドは を返します。ただし、これらのメソッドを呼び出したときの動作はまったく同じではありません。clang を使用すると、変数に空を喜んで割り当てることができます。NSArrayNSMutableArrayidNSArrayNSMutableArray
clangは、ファミリを含む一部のメソッドの戻り値の型を に自動的に変更するinitinstancetypeため、コンパイル時に を[[NSArray alloc] init]返すものNSArray *と を返すものを判別できることがわかりましたNSMutableArray *。しかし、このチェックは単にメソッドでは機能しませんarray。
なんで?私の最後の例のような行は、少なくとも警告を生成するべきではありませんか? これらすべてのメソッドが return として宣言されていないのはなぜinstancetypeですか? 今後変わるのでしょうか?
アップデート
朗報: iOS 7 の時点で、[NSArray array]が返さinstancetypeれるため、a4上記への代入でも警告が発生します。arrayWithContentsOfFile:orのような他のメソッドはarrayWithContentsOfURL依然として を返しidますが…</p>