2013-10-05 2 views

ответ

0

@ символ просто сокращение для определения некоторых общих объектов Objective-C. @"..." представляет собой строку (NSString, которая отличается от обычных строк C), @[...] представляет массив (NSArray), @{...} представляет собой словарь (NSDictionary).

В первой строке вы уже указали объект NSString, используя знак @. newString теперь является экземпляром NSString. На второй строке, вы можете просто дать это имя переменной:

NSLog(newString);

Вы могли теоретически просто дать имя переменной, но это опасный подход. Если newString имеет какие-либо спецификаторы формата, ваше приложение может сбой/беспорядок (или доступ к чему-то, что он не должен получать), потому что NSLog попытается прочитать аргументы, соответствующие спецификаторам формата, но аргументов не существует. Безопасным решением будет NSLog(@"%@", newString);. Первый аргумент NSLog теперь жестко запрограммирован и не может быть изменен. Теперь мы знаем, что он ожидает один аргумент, который мы предоставляем этому аргументу, newString, поэтому мы в безопасности.

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

+1

Это потенциально небезопасно, и вы не должны попасть в этой привычке. 'NSLog (@"% @ ", newString);' правильно. См. Http://en.wikipedia.org/wiki/Uncontrolled_format_string. –

+1

-1 для 'NSLog (newString)' –

+0

не будет обрабатывать NSLOG? он все равно не принимает обычные строки C, вам нужно предоставить NSString, который в любом случае должен контролироваться. –

3

NSLog работает в основном как C printf с добавлением спецификатора формата строки %@, который предназначен для объектов. Будучи NSString объектом, %@ правильный формат для использования:

NSString *newString = @"Hello this is a string!"; 
NSLog(@"%@", newString); 

Ибо, как заманчиво, как это может выглядеть, НИКОГДА сделать

NSLog(newString); //NONONONONO! 

, так как это страшная практика, которая может привести к неожиданным авариям (не говоря уже о проблемах безопасности).

Более подробная информация по теме: Warning: "format not a string literal and no format arguments"

Смежные вопросы