В Задаче 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, хотя…

Ответы на вопрос(2)

Ваш ответ на вопрос