En el Objetivo C, ¿por qué se me permite asignar un NSArray a un NSMutableArray sin error ni advertencia?

Me molesta un comportamiento extraño, ilustrado por el siguiente ejemplo:

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 yarray método tanto de laNSArray yNSMutableArray clases de regresoid. Sin embargo, el comportamiento cuando llamo a estos métodos simplemente no es el mismo, y Clang me permite asignar un vacío vacío.NSArray a unaNSMutableArray ¡variable!

Resulta queclang cambiará automáticamente el tipo de retorno de algunos métodos, incluido elinit familia, ainstancetype, y así poder determinar en tiempo de compilación que[[NSArray alloc] init] devuelve unNSArray * y no unNSMutableArray *. Pero esta comprobación simplemente no funciona con elarray método.

¿Por qué? ¿No deberían generar líneas como mi último ejemplo?al menos ¿una advertencia? ¿Por qué no se declaran todos estos métodos como regresando?instancetype? ¿Cambiará en el futuro?

Actualizar

Buenas noticias: a partir de iOS 7,[NSArray array] devolucionesinstancetype, asi que la asignacion aa4 arriba también produce una advertencia. Otros metodos comoarrayWithContentsOfFile: oarrayWithContentsOfURL todavía regresoid, aunque…

Respuestas a la pregunta(2)

Su respuesta a la pregunta