2011-10-08 5 views

risposta

13

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 
+0

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

+0

@Matoe Lo farà, grazie per il suggerimento. – chown

Problemi correlati