Xcode. Вопрос о проверке синтаксических ошибок - PullRequest
7 голосов
/ 05 июля 2011

Xcode посмотрел на эту строчку и не жаловался. Проект построен, код аварийно завершился во время выполнения.

NSString *randomName = [NSString stringWithFormat:@"%@, %@, %@",
                         [randomAjectiveList objectAtIndex:ajectiveIndex],
                         [randomNounList objectAtIndex:nounIndex]];

Естественно, если подумать, у меня слишком много "%@" на месте, еще один фактический аргумент. Правильный код должен выглядеть следующим образом

NSString *randomName = [NSString stringWithFormat:@"%@, %@",
                        [randomAjectiveList objectAtIndex:ajectiveIndex],
                        [randomNounList objectAtIndex:nounIndex]];

Я спрашиваю вас, хотя ... почему Xcode не жаловался? Кажется, что такая очевидная вещь связана с счетчиками параметров. Разве это не должно быть проверено во время компиляции? Это специфично для "%@", возможно?

Пожалуйста, сообщите.

1 Ответ

8 голосов
/ 05 июля 2011

Основываясь на быстрой проверке, вы на 100% правы, что это не проверяется во время компиляции, по-видимому, даже статическим анализатором.И наоборот, NSLog проверяется.Итак, на моей машине с XCode 4.0.2 следующее:

[NSString stringWithFormat:@"%d %@ %@"];
NSLog(@"%d %@ %@");

Создает в NSLog предупреждение «Больше«% »преобразований, чем аргументов данных», но не комментирует NSString.

Таким образом, разница между фиксированными вызовами функций и динамическими вызовами.На самом деле компилятор не может быть полностью уверен, куда пойдет вызов NSString, поскольку возможно, что вы объявили категорию или использовали низкоуровневое время выполнения для настройки таблицы селектора NSString во время выполнения.

Однако, особенноучитывая проблемы, с которыми вы почти сразу столкнетесь, если начнете изменять поведение классов Foundation, как вы, я бы ожидал, по крайней мере, предупреждение.

...