2011-10-08 13 views

Respuesta

13

declarar el método como este en su @interface:

- (id)myObjectWithObjects:(id)firstObject, ... NS_REQUIRES_NIL_TERMINATION; 

Luego, en el @implementation que lo definiría así:

- (id)myObjectWithObjects:(id)firstObject, ... 
{ 
    va_list args; 
    va_start(args, firstObject); 
    for (id arg = firstObject; arg != nil; arg = va_arg(args, id)) 
    { 
     // Do something with the args here 
    } 
    va_end(args); 

    // Do more stuff here... 
} 

El va_list, va_start, va_arg y va_end son todos de serie C sintaxis para manejar argumentos variables Para describirlos simplemente:

  • va_list - Un puntero a una lista de argumentos variables.
  • va_start - Inicializa una va_list para apuntar al primer argumento después del argumento especificado.
  • va_arg - Busca el siguiente argumento fuera de la lista. Debe especificar el tipo del argumento (para que va_arg sepa cuántos bytes extraer).
  • va_end - Libera la memoria retenida por la estructura de datos va_list.

Lee este artículo para una mejor explicación - Variable argument lists in Cocoa


Consulte también: "IEEE Std 1003.1 stdarg.h"


Otro ejemplo de la Apple Technical Q&A QA1405 - Variable arguments in Objective-C methods:

@interface NSMutableArray (variadicMethodExample) 

- (void) appendObjects:(id) firstObject, ...; // This method takes a nil-terminated list of objects. 

@end 

@implementation NSMutableArray (variadicMethodExample) 

- (void) appendObjects:(id) firstObject, ... 
{ 
    id eachObject; 
    va_list argumentList; 
    if (firstObject) // The first argument isn't part of the varargs list, 
    {         // so we'll handle it separately. 
     [self addObject: firstObject]; 
     va_start(argumentList, firstObject); // Start scanning for arguments after firstObject. 
     while (eachObject = va_arg(argumentList, id)) // As many times as we can get an argument of type "id" 
      [self addObject: eachObject]; // that isn't nil, add it to self's contents. 
     va_end(argumentList); 
    } 
} 

@end 
+0

Gracias, aceptó. Solo agregué que encontré http://cocoawithlove.com/2009/05/variable-argument-lists-in-cocoa.html, y sería bueno si editaras tu respuesta diciendo a los lectores que se necesita el uso de stdarg. De todos modos, muchas gracias, lo aceptaré tan pronto como StackOverflow me lo permita. – Matoe

+0

@Matoe Lo haré, gracias por la sugerencia. – chown

Cuestiones relacionadas