2009-07-26 41 views
1

我有一個具有可選參數的指定初始化程序(類似於下面的代碼),我想通過調用它來創建一個autorelease方法。有沒有辦法做到這一點?如何將可選參數發送到另一個函數/方法?

@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

下一次搜索網站首先,這裏有大量的重複項目。 – 2009-07-26 18:28:29

回答

6

你不能這樣做。請參閱comp.lang.c FAQ。你可以做的最接近的事情是創建你的函數的兩個版本,一個採用可變參數(...),另一個採用va_list。該可變參數版本,則可以將工作轉嫁給了va_list版本,以避免重複代碼:

@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

- (id)initWithVaList:(va_list)參數應該如何迭代參數? 這是我試過的。 id eachObject; while(eachObject = va_arg(args,id)) 結果是當我這樣做第一個參數是不是在該while循環中找到.. – hfossli 2010-03-02 22:03:31

3

通常的方式做默認參數與方法重載的語言是:


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

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

很好的解決方法。對於錯誤的C沒有可選的參數。 – Eugene 2010-11-29 21:22:38

相關問題