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, parainstancetype
e, 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…