if ([self respondsToSelector: @selector(foo)])
[self foo];
Это выражение только"совершенно безопасно", если нет аргументов и нет возвращаемого значения.Если требуется какая-либо информация о типе, @selector(foo)
недостаточно.
Даже тогда я подозреваю, что существуют архитектуры, ABI которых таковы, что в случае отсутствия аргументов без возврата фактически требуется наличие знаний о типах.чтобы компилятор мог генерировать код, который абсолютно гарантированно корректен.
То есть ваш пример fooWithInteger:
и / или fooWithX:y:z:
может не может быть скомпилирован правильнобез полной информации о типе, доступной из-за капризов языка C и специфичного для архитектуры ABI.
Кроме того, чтобы компилятор мог компилировать это без предупреждения, потребуется компилятор для слияния выражения времени выполнения - respondsToSelector:
должен быть динамически отправлен - с выражением времени компиляции.Компиляторы ненавидят это.