2010-03-06 27 views
37

busqué en Google y aprendí cómo usar los argumentos variables. pero quiero pasar mis argumentos variables a otro método. Estoy recibiendo errores. como hacer eso ?cómo pasar argumentos variables a otro método?

-(void) aMethod:(NSString *) a, ... { 
    [self anotherMethod:a]; 
    // i m doing this but getting error. how to pass complete vararg to anotherMethod 
} 

Respuesta

49

yo sepa ObjectiveC (igual que en C y C++) no le proporcionan con una sintaxis que permite lo que se tiene en cuenta directamente.

La solución habitual es crear dos versiones de una función. Uno que puede ser llamado directamente usando ... y otro llamado por otras funciones pasando los parámetros en forma de una lista va_.

 
.. 
[obj aMethod:@"test this %d parameter", 1337); 
[obj anotherMethod:@"test that %d parameter", 666); 
.. 

-(void) aMethod:(NSString *)a, ... 
{ 
    va_list ap; 
    va_start(ap, a); 

    [self anotherMethod:a withParameters:ap]; 

    va_end(ap); 
} 

-(void) anotherMethod:(NSString *)a, ... 
{ 
    va_list ap; 
    va_start(ap, a); 

    [self anotherMethod:a withParameters:ap]; 

    va_end(ap); 
} 

-(void) anotherMethod:(NSString *)a withParameters:(va_list)valist 
{ 
    NSLog([[[NSString alloc] initWithFormat:a arguments:valist] autorelease]); 
} 
+1

Hay un recurso de memoria en -otro método: con Parámetros: Necesita agregar una liberación automática a la [[NSString alloc] init] –

+0

verdadero y corregido @Bill – Till

+0

¡Excelente! Quería pasar una lista de argumentos variables a predicateWithFormat: y después de sugerir esto, me di cuenta de que Apple ha proporcionado un predicateWithFormat: arguments: equivalent que no había notado anteriormente. – ArtOfWarfare

20

No puede pasar varios argumentos directamente. Pero algunos de estos métodos proporcionan una alternativa para pasar un argumento va_list, p. Ej.

#include <stdarg.h> 

-(void)printFormat:(NSString*)format, ... { 
    // Won't work: 
    // NSString* str = [NSString stringWithFormat:format]; 

    va_list vl; 
    va_start(vl, format); 
    NSString* str = [[[NSString alloc] initWithFormat:format arguments:vl] autorelease]; 
    va_end(vl); 

    printf("%s", [str UTF8String]); 
} 
1

¿Ha considerado configurar sus argumentos en una matriz o diccionario y codificando condicionalmente?

-(void) aMethodWithArguments:(NSArray *)arguments { 
    for (id *object in arguments) { 
     if ([object isKindOfClass:fooClass]) { 
      //handler for objects that are foo 
      [self anotherMethod:object]; 
     } 
     if ([object isKindOfClass:barClass]) { 
      //and so on... 
      [self yetAnotherMethod:object]; 
     } 
    } 
} 
0

Creo que podría usar macros para lograr lo mismo. Digamos que usted quiere pasar argumentos variables de aMethod a otro

-(void) aMethod:(NSString *) a, ... { 
} 

Se podría definir su otro 'método' usando macro aunque no es un método real:

#define anotherMethod(_a_,...) [self aMethod:_a_,##__VA_ARGS__] 

Ésta es mi solución.

Cuestiones relacionadas