c - 如何将可选参数发送到另一个函数/方法?

标签 c objective-c

我有一个带有可选参数的指定初始化器(类似于下面的代码),我想通过调用它来创建一个自动释放方法。有什么办法吗?

@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

最佳答案

你做不到。查看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

关于c - 如何将可选参数发送到另一个函数/方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1185177/

相关文章:

objective-c - 是否有等同于 __attribute__((ns_returns_retained)) 的 malloc 指针?

c - gcc 将忙等待优化为死循环

c++ - 处理双数组的未对齐部分,将其余部分向量化

C中按值调用

c++ - GTK+ 通过控件 id 查找 GTKWidget

Python与C交互——回调函数

ios - 根据标签大小调整 UICollectionViewCell 的大小

objective-c - 如何切换 NSTextView 的 Ruler?

ios - 应用程序崩溃。控件不移动到 catch 语句

ios - 使用包含另一个 View 的 Navigation Controller 在 segue 中设置属性