2009-07-26 77 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

相关问题