Я думаю, что вам нужно что-то вроде:
+ (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
, потому что кадр стека (если он вообще есть) больше не работает должным образом. настроены для фактического возврата.
Вы почти получили это; всего пара настроек:
+ (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];
}
Это должно сделать то, что вы ищете.