dichiarare il metodo come questo nel tuo @interface
:
- (id)myObjectWithObjects:(id)firstObject, ... NS_REQUIRES_NIL_TERMINATION;
Poi nel @implementation
definirebbe così:
- (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...
}
Il va_list
, va_start
, va_arg
e va_end
sono tutti di serie C sintassi per la gestione degli argomenti variabili. Per descriverli semplicemente:
va_list
- Un puntatore a un elenco di argomenti variabili.
va_start
- Inizializza un va_list in modo che punti al primo argomento dopo l'argomento specificato.
va_arg
- Riporta l'argomento successivo fuori dalla lista. È necessario specificare il tipo di argomento (in modo che va_arg sappia quanti byte estrarre).
va_end
- Rilascia qualsiasi memoria contenuta nella struttura dati va_list.
Leggi questo articolo per una spiegazione migliore - Variable argument lists in Cocoa
Consulta anche: "IEEE Std 1003.1 stdarg.h"
Un altro esempio dal 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
Grazie, ACCETTATO. Aggiungo solo che ho trovato http://cocoawithlove.com/2009/05/variable-argument-lists-in-cocoa.html, e sarebbe bello se avessi modificato la tua risposta dicendo ai lettori che è necessario utilizzare lo stdarg. Comunque, grazie mille, accetterò non appena StackOverflow me lo consentirà. – Matoe
@Matoe Lo farà, grazie per il suggerimento. – chown