什么时候会使用initWithFormat:arguments?

时间:2010-02-11 02:54:11

标签: cocoa nsstring

NSString方法initWithFormat:arguments:将va_list作为参数。我无法弄清楚何时使用它(甚至如何使用它)。当常规的initWithFormat:更加用户友好时,为什么Apple会添加这样的方法?

3 个答案:

答案 0 :(得分:11)

您无法将格式参数的动态列表传递给-initWithFormat:。例如,如果您想在没有-stringByAppendingFormat:的情况下自己实施-initWithFormat:arguments:,那么您就有了它的工作。使用va_list版本,您可以执行此操作:

- (NSString *)stringByAppendingFormat:(NSString *)format, ... {
    va_list args;
    va_start(args, format);
    NSString * result = [self stringByAppendingString:[NSString stringWithFormat:format arguments:args]];
    va_end(args);
    return result;
}

答案 1 :(得分:3)

当您自己的函数或方法使用可变参数时,它很有用,因为在这种情况下,不可能使用vanilla initWithFormat:方法。

例如,以下(无用的)示例代码段:

void log(NSString* format, ...)
{
    va_list arguments;
    va_start(arguments, format);

    // impossible:
    // NSString* formattedString = [[NSString alloc] initWithFormat: ???];

    // possible
    va_list argsCopy;
    va_copy(argsCopy, arguments);
    NSString* formattedString = [[NSString alloc] initWithFormat:format arguments:argsCopy];    

    // do something cool with your string
    NSLog(@"%@", formattedString);
    va_end(argsCopy);
    va_end(arguments);
}

答案 2 :(得分:0)

我想说的是,在没有进一步研究的情况下,Apple在NSString initWithFormat:之上提供NSString initWithFormat:arguements:作为实用方法,这意味着短版本最终会调用更长的版本。

还有[NSString stringWithFormat:]可以返回一个自动释放的NSString,如果你不需要长时间的字符串就可以保存alloc调用。