Строковые литералы используются в качестве ключей в словарях, в качестве параметров для веб-сервисов. Читателю предлагается отвлечься на минутку и обнаружить ошибку в коде:

NSDictionary *d = @{@"login": @"vasya", @"password": @"qwerty"};
[AuthenticationService loginWithLogin:d[@"login"] password:d[@"passwrod"]];

Второй пример посложнее:

[AuthenticationService setAuthOption:@"XFAUTHHTTPMODE"];

Ну и третий пример:

NSString *urlString = [NSString stringWithFormat:baseURL, @"8743b52063cd84097a65d1633f5c74f5"];

В первом примере допущена орфографическая ошибка в ключе “password”. Во втором примере ключ сформирован явно не по правилам английского языка, поэтому знание орфографии здесь не помогат. Такой ключ можно проверить только по документации (ну или по памяти, у кого она хорошая). В третьем случае проверить правильность ключа можно только сверив с источником, откуда этот ключ был получен.

Ошибки в строковых литералах нельзя обнаружить ни на этапе ввода кода, ни на этапе компиляции. Самый ранний этап обнаружения таких ошибок — модульное тестирование.

Надежно!

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

Как обнаружить эту ошибку на более ранних этапах, например, на этапе компиляции? Решение: избавиться от строковых литералов, заменив их на ссылки на объекты строкового типа. Таким образом, строковый литерал будет записан в программе единожды, а последующие опечатки будут исключены: компилятор не скомпилирует идентификатор с опечаткой. Например:

NSString const * loginKey = @"login";
NSString const * passwordKey = @"password";
NSDictionary *d = @{loginKey: @"vasya", passwordKey: @"qwerty"};
[AuthenticationService loginWithLogin:d[loginKey] password:d[passwordKey]];

Можно следовать простому правилу: каждый строковый литерал должен встречаться в программе только один раз. Если один и тот же строковый литерал нужно использовать несколько раз, то вместо него объявляется константная ссылка на объект строки, затем используется только эта ссылка.