Что лучше и почему?
Явная информация о наборе всегда лучше, если вы просто не можете ее использовать по какой-либо причине (см. Ниже).
Этопозволяет компилятору гораздо более строго проверять код и во время компиляции будет отлавливать много ошибок, которые в противном случае приводили бы к сбою приложения во время выполнения.
Давным-давно, все в используемых API-интерфейсах id
.Это оказалось полной болью в заднице;хрупкий и привел ко многим сбоям, которые могли быть обнаружены с определенными типами.
Итак, это было изменено.(Это было ~ 1994).
Что лучше в таких ситуациях, как метод инициализации класса и обычные переменные в коде?
Для init
у вас естьнет другого выбора, кроме как использовать общий тип возвращаемого значения (id)
.Objective-C не поддерживает ни ко-вариантные, ни контра-вариантные объявления, а также не существует механизма для обобщения объявления init
, в то же время обеспечивая поддержку для конкретной проверки типов.
То же самое относится к retain
, objectAtIndex:
, addObject:
и многие другие методы, которые принимают или возвращают один из множества видов объектов (или принимают их в качестве аргументов).
И, нет, абсолютно никакой разницы в производительности между id
и, скажем, NSView*
.
Не могли бы вы привести пример, когда явная типизация вызовет проблему, пожалуйста?
Если вы написали:
- (MyClass *) init;
И в подклассе:
- (MySubclass *) init;
Скорее всего, вы получите предупреждения компилятора о wazoo, или вам придется типизировать wazoo.