Форматировать не строковый литерал и не форматировать аргументы - PullRequest
0 голосов
/ 12 октября 2011

Я получаю Формат не строковый литерал и ошибка компиляции аргументов формата.

Вот мой код

Я пытаюсь добавить NSMutableArray.

for (int i=0; i<feed.count; i++) {
    [html appendFormat:[self.itemName objectAtIndex:i]]; }

Может кто-нибудь помочь мне, пожалуйста.

Ответы [ 3 ]

3 голосов
/ 12 октября 2011

Вы звоните -appendFormat: с переменной в качестве строки формата.Это очень плохая идея, потому что наличие любого спецификатора формата (в основном, любой последовательности "%", за которой следует другой символ) заставит -appendFormat: попытаться прочитать следующий аргумент в varargs, который вы не предоставилии, следовательно, он будет считывать мусорную память из стека и пытаться вставить ее.В лучшем случае это будет крах.В худшем случае это вектор для эксплойта безопасности.

Вместо этого вы должны использовать -appendString:.

Обратите внимание, это предполагает, что [self.itemName objectAtIndex:i] - это NSString*.Если это что-то еще, вы можете вместо этого добавить его описание, например [html appendFormat:@"%@", [self.itemName objectAtIndex:i]], или добавить что-то еще в зависимости от его точного типа.

2 голосов
/ 12 октября 2011

Что должен делать этот код? -[NSMutableString appendFormat:] принимает строку формата подобно @"The %@ says %@" и «заполняет пробелы» остальными аргументами.

Некоторые из редко используемых спецификаторов формата опасны тем, что они могут раскрыть информацию из вашей программы или вызвать ее сбой (так называемая неконтролируемая атака строки формата ).

Из-за этого (и поскольку строки формата предназначены для сбора информации из переменных), вы всегда хотите, чтобы сама строка формата была литеральной строкой, а не из переменной или массива.

Итак, вы можете использовать appendFormat: так:

for (int i=0; i<feed.count; i++) {
    [html appendFormat: @"%@", [self.itemName objectAtIndex:i]]; }

Или вы можете просто использовать appendString: вместо:

for (int i=0; i<feed.count; i++) {
    [html appendString:[self.itemName objectAtIndex:i]]; }
2 голосов
/ 12 октября 2011

Метод appendFormat: требует строку в качестве первого параметра.

Таким образом, ваша селекторная отправка должна выглядеть примерно так:

[html appendFormat:@"%@", [self.itemName objectAtIndex:i]];

Хотя вы также можете добавить строку:

[html appendString:[[self.itemName objectAtIndex:i] description]];

Я добавил сообщение description на случай, если объект не является прямой строкой, чтобы быть явным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...