2010-02-11 9 views

Respuesta

11

no se puede pasar una lista dinámica de los argumentos de formato para -initWithFormat:. Por ejemplo, si quiere implementar -stringByAppendingFormat: usted mismo sin -initWithFormat:arguments:, tendrá un trabajo. Con la versión va_list, puede hacerlo:

- (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

Gran respuesta, gracias. – calvinlough

0

Yo diría sin mirar más allá que Apple proporciona NSString initWithFormat: como un método de utilidad en la parte superior de NSString initWithFormat:arguements: lo que significa que la versión corta acaba llamando al más largo.

También hay [NSString stringWithFormat:] que puede devolver un NSString autorellenado, guardándole la llamada alloc si no necesita la cadena por mucho tiempo.

3

es útil cuando su propia función y método utiliza argumentos variadic, porque en ese caso no se puede utilizar el método de initWithFormat: vainilla.

Por ejemplo, la (inútil) ejemplo siguiente fragmento:

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); 
} 
Cuestiones relacionadas