2010-06-29 12 views
9

No puedo entender la sintaxis de múltiples argumentos en Objective-C. He visto this question, pero la respuesta no me ha ayudado (todavía).Cómo usar va_args para pasar argumentos en (parámetros variados, puntos suspensivos)

Aquí está mi código (en realidad me va a querer para pasar finalmente a NSString stringWithFormat, pero conseguir un NSLog a trabajar sería suficiente por ahora):

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification { 
    // Insert code here to initialize your application 
    [self log:@"blah blah %d", 32]; 
} 


- (void)log:(NSString *)text, ... { 
     va_list args; 
     va_start(args, text); 
     NSLog(text, args); 
} 

El argumento (o algún argumento) viene a través , pero tiene un valor raro (la salida es blah blah 1606412704). ¿Cómo debo pasar los valores que vienen a través del ...?

+0

Relacionado con, pero no es exactamente un duplicado de: http://stackoverflow.com/questions/2345196 –

Respuesta

20

Hay una variante de NSLog que acepta un va_list llamada NSLogv:

- (void) log:(NSString *)text, ... { 
    va_list args; 
    va_start(args, text); 
    NSLogv(text, args); 
    va_end(args); 
} 

La única manera de reenviar el real ... (no el va_list) es usa una macro Por ejemplo:

#define MyLog(f, ...) { \ 
NSLog(f, ##__VA_ARGS__); \ 
[someObject doSomething:f, ##__VA_ARGS__]; \ 
} 

Sin embargo, esto se debe usar con moderación, ya que las macros pueden hacer que el código muy ofuscado.

+0

Eso es genial y +1, pero todavía no sé cómo pasar los argumentos al siguiente método (o quizás lo estoy haciendo bien?) –

+3

No se puede. Una vez que '...' se convierte en 'va_list', solo se puede pasar a una función o método que acepte' va_list', no a una función/método que acepte un número variable de parámetros. – Yuji

+0

@Yuji, ooooooooooooooooo déjame probarlo. –

12

Usted podría utilizar -[NSString initWithFormat:arguments:]:

- (void)log:(NSString *)text, ... 
{ 
    va_list args; 
    va_start(args, text); 
    NSString *log_msg = [[[NSString alloc] initWithFormat:text arguments:args] autorelease]; 
    NSLog(@"%@", log_msg); 
} 
+0

Wow. Si bien eso no responde mi pregunta, resuelve mi problema actual. Sin embargo, ¿cómo pasarías los argumentos al siguiente método? –

+0

No puede pasar los parámetros variables. Puede pasar 'args', pero eso significa que la función o método tiene que tomar un objeto de tipo' va_list'. – mipadi

+1

De acuerdo, eso es genial. Terminé haciendo esto '- (void) log: (NSString *) text, ...;' y '- (void) log: (NSString *) text withArguments: (va_list) list;' –

Cuestiones relacionadas