2010-02-11 31 views
8

Die NSString-Methode initWithFormat: arguments: verwendet eine va_list als Argument. Ich kann nicht herausfinden, wann es verwendet werden würde (oder sogar wie man es benutzt). Warum würde Apple eine solche Methode hinzufügen, wenn das reguläre initWithFormat: viel benutzerfreundlicher ist?Wann würde initWithFormat: Argumente: verwendet werden?

Antwort

11

Sie nicht eine dynamische Liste von Format Argumente -initWithFormat: passieren kann. Zum Beispiel, wenn Sie -stringByAppendingFormat: selbst ohne -initWithFormat:arguments: implementieren möchten, würden Sie eine Arbeit davon haben. Mit der va_list Version könnten Sie es tun:

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

Große Antwort, danke. – calvinlough

0

Ich würde sagen, ohne weiter darauf zu schauen, dass Apple NSString initWithFormat: als eine Hilfsmethode auf NSString initWithFormat:arguements: bereitstellt, was bedeutet, dass die kurze Version nur endet, die längere anrufend.

Es gibt auch [NSString stringWithFormat:], das einen automatisch freigegebenen NSString zurückgeben kann, wodurch Sie den Aufruf alloc speichern, wenn Sie die Zeichenfolge nicht lange brauchen.

3

Es ist nützlich, wenn Ihre eigene Funktion oder Methode variadic Argumente verwendet, denn in diesem Fall ist es unmöglich, die Vanilla initWithFormat: Methode zu verwenden.

Zum Beispiel die folgenden (nutzlosen) Beispiel Snippet:

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); 
} 
Verwandte Themen