Xcode. Вопрос о проверке синтаксических ошибок
Xcode посмотрел на эту строчку и не жаловался. Проект построен, код завис во время выполнения.
NSString *randomName = [NSString stringWithFormat:@"%@, %@, %@",
[randomAjectiveList objectAtIndex:ajectiveIndex],
[randomNounList objectAtIndex:nounIndex]];
Естественно, если подумать, у меня слишком много "%@
"на месте, еще один фактические аргументы. Правильный код должен выглядеть следующим образом
NSString *randomName = [NSString stringWithFormat:@"%@, %@",
[randomAjectiveList objectAtIndex:ajectiveIndex],
[randomNounList objectAtIndex:nounIndex]];
Я спрашиваю вас, хотя... почему Xcode не жаловался? Кажется, что такая очевидная вещь связана с счетчиками параметров. Разве это не должно быть проверено во время компиляции? Это специфично для "%@
Возможно?
Пожалуйста, порекомендуйте.
1 ответ
Основываясь на быстрой проверке, вы на 100% правы, что это не проверяется во время компиляции, по-видимому, даже статическим анализатором. Наоборот, NSLog проверяется. Итак, на моей машине, с XCode 4.0.2, следующее:
[NSString stringWithFormat:@"%d %@ %@"];
NSLog(@"%d %@ %@");
Создает предупреждение в NSLog "Больше"% "преобразований, чем аргументов данных", но не комментирует NSString.
Таким образом, разница может заключаться в фиксированных вызовах функций и динамических вызовах. На самом деле компилятор не может быть полностью уверен, куда пойдет вызов NSString, поскольку возможно, что вы объявили категорию или использовали низкоуровневое время выполнения для настройки таблицы селектора NSString во время выполнения.
Однако, особенно с учетом проблем, с которыми вы почти сразу столкнетесь, если начнете изменять поведение базовых классов, как вы, я бы ожидал, по крайней мере, предупреждение.