Ответ 1
Но эта проверка просто не работает с методом массива. Почему?
Как указано в документе, который вы связали, это потому, что -array
не дает признанного типа связанных результатов. ObjC очень динамичен - компилятор не может гарантировать тип результата +array
. Он делает это предположение с помощью некоторых методов, потому что соглашения об именах хорошо определены (например, +alloc
, -init
, +new
, -self
и т.д.). Таким образом, эта реализация просто прибегает к соглашениям об именах.
Компилятор также проверяет некоторые соглашения об именах в областях, которые вы не можете ожидать:
@implementation NSArray (DEMO)
- (id)initStr
{
return [NSString new]; // << warning. RE: init prefix
}
@end
Должны ли строки, подобные моему последнему примеру, генерировать хотя бы предупреждение? Почему не все эти методы объявлены как возвращаемые instancetype? Будет ли это изменяться в будущем?
instancetype
был введен примерно год назад (по внешнему виду). Некоторые из API были написаны несколько десятилетий назад. Я подозреваю, что это произойдет - вовремя - потому что (если используется правильно), это может указывать на множество проблем в существующем коде. Конечно, эти изменения нарушат существующие сборки (опять же, как правило, хорошие исправления, если они указаны в правильных местах).
Таким образом, файлы ошибок и дать инструменты и библиотеки несколько лет для обновления. Предполагая, что изменения сделаны, это, вероятно, произойдет при основном обновлении ОС.
Вероятно, было бы лучше, если бы он был включен как необязательное предупреждение в течение некоторого времени (в случае заголовков системы). Конечно, они могли бы использовать его с обратной совместимостью для старых компиляторов для новых API.
Кроме того, это изменение может быть легко модернизировано (не то, что более ранние компиляторы могли бы понять смысловую разницу между id
и instancetype
) простым typedef. Одна проблема с typedef заключается в том, что это глобальная декларация - компилятор может ограничивать атрибут word/modifier/для данной области, не вызывая боли при имитации ключевого слова, добавляя глобальный typedef. Apple GCC, возможно, никогда не поддерживает instancetype
, поэтому логичный способ его внедрения для Apple GCC может быть глобальным typedef
id
, что может вызвать проблемы для некоторых людей (без семантической выгоды, если этот маршрут был взят), Обратите внимание, что аналогичные изменения были сделаны Apple в прошлом.