次の例に示されている奇妙な動作に悩まされています。
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 を使用すると、変数に空を喜んで割り当てることができます。NSArray
NSMutableArray
id
NSArray
NSMutableArray
clangは、ファミリを含む一部のメソッドの戻り値の型を に自動的に変更するinit
instancetype
ため、コンパイル時に を[[NSArray alloc] init]
返すものNSArray *
と を返すものを判別できることがわかりましたNSMutableArray *
。しかし、このチェックは単にメソッドでは機能しませんarray
。
なんで?私の最後の例のような行は、少なくとも警告を生成するべきではありませんか? これらすべてのメソッドが return として宣言されていないのはなぜinstancetype
ですか? 今後変わるのでしょうか?
アップデート
朗報: iOS 7 の時点で、[NSArray array]
が返さinstancetype
れるため、a4
上記への代入でも警告が発生します。arrayWithContentsOfFile:
orのような他のメソッドはarrayWithContentsOfURL
依然として を返しid
ますが…</p>