2010-02-11 19 views
8

Il metodo NSString initWithFormat: argomenti: accetta un va_list come argomento. Non riesco a capire quando sarà usato (o anche come usarlo). Perché Apple dovrebbe aggiungere un tale metodo quando il normale initWithFormat: è molto più user-friendly?Quando initWithFormat: argomenti: essere usato?

risposta

11

Non è possibile passare un elenco dinamico di argomenti di formato per -initWithFormat:. Ad esempio, se volessi implementare lo -stringByAppendingFormat: senza lo -initWithFormat:arguments:, avresti un lavoro da svolgere. Con la versione va_list, è possibile farlo:

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

Grande risposta, grazie. – calvinlough

0

Direi senza approfondire che Apple fornisce NSString initWithFormat: come un metodo di utilità in cima a NSString initWithFormat:arguements: che significa che la versione breve termina solo chiamando quella più lunga.

C'è anche [NSString stringWithFormat:] che può restituire un NSString autoreleased, salvandoti la chiamata alloc se non hai bisogno della stringa in giro a lungo.

3

È utile quando la propria funzione o metodo utilizza argomenti variadici, poiché in tal caso è impossibile utilizzare il metodo vaniglia initWithFormat:.

Ad esempio, la seguente (inutile) frammento di esempio:

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); 
} 
Problemi correlati