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
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
@Matoe Lo haré, gracias por la sugerencia. – chown