No Objective C, por que posso atribuir um NSArray a um NSMutableArray sem erro ou aviso?

Estou perturbado por um comportamento estranho, ilustrado pelo seguinte exemplo:

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]; 

Ambosinit earray método de ambosNSArray eNSMutableArray aulas retornamid. No entanto, o comportamento quando eu chamo esses métodos simplesmente não é o mesmo, e clang me deixa felizmente atribuir um vazioNSArray para umNSMutableArray variável!

Acontece queclang irá alterar automaticamente o tipo de retorno de alguns métodos, incluindo oinit família, parainstancetypee, assim, ser capaz de determinar em tempo de compilação[[NSArray alloc] init] retorna umNSArray * e não umNSMutableArray *. Mas esta verificação simplesmente não funciona com oarray método.

Por quê? Linhas não devem como o meu último exemplo gerarfinalmente um aviso? Por que nem todos esses métodos são declarados como retornandoinstancetype? Isso mudará no futuro?

Atualizar

Boas notícias: no iOS 7,[NSArray array] devolveinstancetype, então a tarefa dea4 acima também produz um aviso. Outros métodos comoarrayWithContentsOfFile: ouarrayWithContentsOfURL ainda retorneid, Apesar…

questionAnswers(2)

yourAnswerToTheQuestion