Основываясь на быстрой проверке, вы на 100% правы, что это не проверяется во время компиляции, по-видимому, даже статическим анализатором.И наоборот, NSLog проверяется.Итак, на моей машине с XCode 4.0.2 следующее:
[NSString stringWithFormat:@"%d %@ %@"];
NSLog(@"%d %@ %@");
Создает в NSLog предупреждение «Больше«% »преобразований, чем аргументов данных», но не комментирует NSString.
Таким образом, разница между фиксированными вызовами функций и динамическими вызовами.На самом деле компилятор не может быть полностью уверен, куда пойдет вызов NSString, поскольку возможно, что вы объявили категорию или использовали низкоуровневое время выполнения для настройки таблицы селектора NSString во время выполнения.
Однако, особенноучитывая проблемы, с которыми вы почти сразу столкнетесь, если начнете изменять поведение классов Foundation, как вы, я бы ожидал, по крайней мере, предупреждение.