2009-07-26 16 views
1

Ich habe einen designierten Initialisierer mit optionalen Argumenten (ähnlich dem folgenden Code), und ich möchte eine Autorelease-Methode erstellen, indem ich sie aufruft. Gibt es eine Möglichkeit, dies zu tun?Wie senden Sie optionale Argumente an eine andere Funktion/Methode?

@interface MyObject : NSObject 

- (id)initWithArgs:(id)firstArg, ...; 
+ (id)objectWithArgs:(id)firstArg, ...; 

@end 

@implementation MyObject 

- (id)initWithArgs:(id)firstArg, ... 
{ 
    if (!firstArg || ![super init]) { 
     return nil 
    } 

    va_list argList; 
    va_start(argList, firstArg); 

    id currentObject = firstArg; 
    do { 
     NSLog(@"%@", currentObject); 
    } while ((currentObject = va_arg(argList, id)) != nil); 

    va_end(argList); 
    return self; 
} 

+ (id)objectWithArgs:(id)firstArg, ... 
{ 
    // return [[[MyObject alloc] initWithArgs:firstArg, ...] autorelease]; 
} 

@end 
+0

nächstes Mal auf die Site suchen Erstens gibt es Tonnen von Duplikaten dafür. –

Antwort

6

Sie können es nicht tun. Siehe die comp.lang.c FAQ. Das nächste, was Sie tun können, ist zwei Versionen Ihrer Funktionen zu erstellen, eine, die varargs (...), und eine, die eine va_list dauert. Die varargs Version kann dann die Arbeit an die va_list Version abgehen doppelten Code zu vermeiden:

@interface MyObject : NSObject 

- (id)initWithArgs:(id)firstArg, ...; 
- (id)init:(id)firstArg withVaList:(va_list)args; 
+ (id)objectWithArgs:(id)firstArg, ...; 
+ (id)object:(id)firstArg withVaList:(va_list)args; 

@end 

@implementation MyObject 

- (id)initWithArgs:(id)firstArg, ... 
{ 
    va_list args; 
    va_start(args, firstArg); 
    id result = [self init:firstArg withVaList:args]; 
    va_end(args); 
    return result; 
} 

- (id)init:(id)firstArg withVaList:(va_list)args 
{ 
    // do actual init here: 
    while((id arg = va_arg(args, id))) 
    { 
     // ... 
    } 
} 

+ (id)objectWithArgs:(id)firstArg, ... 
{ 
    va_list args; 
    va_start(args, firstArg); 
    id result = [MyObject object:firstArg withVaList:args]; 
    va_end(args); 
    return result; 
} 

+ (id)object:(id)firstArg withVaList:(va_list)args 
{ 
    return [[[MyObject alloc] init:firstArg withVaList:args] autorelease]; 
} 

@end 
+0

Wie sollte - (ID) InitWithVaList: (Va_List) Args über die Argumente iterieren? das habe ich ausprobiert. ID eachObject; while (eachObject = va_arg (args, id)) Ergebnis ist, wenn ich dies tun das erste Argument ist nicht in der While-Schleife zu finden .. – hfossli

3

Der üblicher Weg Standardargumente in Sprachen mit Methode Überlastung zu tun ist:


function foo(bar, baz) { 
    ... actual function code here ... 
} 

function foo(bar) { 
    foo(bar, 42) 
} 
+0

Schöne Workaround. Zu schlechtem C hat keine optionalen Argumente. – Eugene

Verwandte Themen