2010-02-11 144 views

回答

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; 
} 
+0

偉大的答案,謝謝。 – calvinlough 2010-02-11 03:08:58

0

我會說,沒有深入研究,蘋果提供NSString initWithFormat:作爲NSString initWithFormat:arguements:之上的實用方法,這意味着短版本最終只會調用較長的版本。

還有[的NSString stringWithFormat:],可以返回一個autoreleased的NSString,節約了您的通話alloc如果你不需要串繞很長時間。

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); 
} 
相關問題