Что является надлежащим способом перенести [NSString stringWithFormat:]?

int code = 2;
Environment.Exit( code );
7
задан Senseful 30 July 2009 в 22:10
поделиться

2 ответа

Я думаю, что вам нужно что-то вроде:

+ (NSString *) myFormattedString:(NSString *)format, ... {
  va_list args;
  va_start(args, format);
  NSString *str = [[[NSString alloc] initWithFormat:format arguments:args] autorelease];
  va_end(args);
  return [NSString stringWithFormat:@"Foo: %@.", str];
}

Макросы stdarg.h va_ * используются, когда функция (или, в данном случае, метод) принимает переменное количество аргументов, как указано в « ... ». va_start () используется для нахождения начала, с которого начинается переменное количество аргументов. Таким образом, ему необходимо знать последний аргумент функции / метода (тот, который находится непосредственно перед « ... »), чтобы определить, где начинается переменное количество аргументов. Это несколько упрощенное объяснение, поскольку то, что на самом деле происходит под капотом, очень специфично для ABI / компилятора. Самым важным моментом является то, что вторым аргументом va_start () всегда является имя переменной «непосредственно перед« ... »».

va_end () следует «вызвать» (это действительно макрос, а не функция) для максимальной переносимости. Опять же, вся эта штука с переменными аргументами - глубокая черная магия. В зависимости от специфики компилятора и ABI, va_end () может вообще ничего не делать. С другой стороны, отказ от использования va_end () может привести к сбою вашей программы при достижении оператора return , потому что кадр стека (если он вообще есть) больше не работает должным образом. настроены для фактического возврата.

15
ответ дан 6 December 2019 в 07:52
поделиться

Вы почти получили это; всего пара настроек:

+ (NSString *) myFormattedString:(NSString *)format, ... {
  va_list args;
  va_start(args, format);

  NSString *str = [[NSString alloc] initWithFormat:format arguments:args];
  [str autorelease];

  va_end(args);

  return [NSString stringWithFormat:@"Foo: %@.", str];
}

Это должно сделать то, что вы ищете.

8
ответ дан 6 December 2019 в 07:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: