2010-02-11 5 views

Répondre

11

Vous ne pouvez pas passer une liste dynamique des arguments de format à -initWithFormat:. Par exemple, si vous vouliez implémenter -stringByAppendingFormat: vous-même sans -initWithFormat:arguments:, vous auriez un travail. Avec la version va_list, vous pouvez le faire:

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

Bonne réponse, merci. – calvinlough

0

Je dirais sans regarder plus loin que Apple fournit NSString initWithFormat: comme méthode utilitaire au-dessus de NSString initWithFormat:arguements: ce qui signifie que la version courte finit par appeler le plus long.

Il y a aussi [NSString stringWithFormat:] qui peut renvoyer un NSString auto-libéré, en vous sauvant l'appel alloc si vous n'avez pas besoin de la chaîne pour longtemps.

3

Il est utile lorsque votre propre fonction ou méthode utilise des arguments variadiques, car dans ce cas il est impossible d'utiliser la méthode initWithFormat: de vanilla.

Par exemple, les éléments suivants (inutile) Exemple d'extrait:

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); 
} 
Questions connexes