В Задаче C, почему я могу назначить NSArray для NSMutableArray без ошибок или предупреждений?
Меня беспокоит странное поведение, проиллюстрированное следующим примером:
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
метод какNSArray
а такжеNSMutableArray
возвращение классовid
, Тем не менее, поведение, когда я вызываю эти методы, просто не то же самое, и Clang позволяет мне с радостью назначить пустойNSArray
чтобыNSMutableArray
переменная!
Оказывается, чтоclang автоматически изменит тип возвращаемого значения некоторых методов, включаяinit
семья, чтобыinstancetype
и, таким образом, быть в состоянии определить во время компиляции, что[[NSArray alloc] init]
возвращаетNSArray *
и неNSMutableArray *
, Но эта проверка просто не работает сarray
метод.
Почему? Должны ли строки, подобные моему последнему примеру, генерироватьсяпо крайней мере предупреждение? Почему не все эти методы объявлены как возвращающиеinstancetype
? Изменится ли это в будущем?
Обновить
Хорошие новости: с iOS 7,[NSArray array]
возвращаетсяinstancetype
, так что назначениеa4
выше также выдает предупреждение. Другие методы, такие какarrayWithContentsOfFile:
или жеarrayWithContentsOfURL
все еще возвращаюсьid
, хотя…