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…