Variadic args。如何将可变参数args传递给方法

时间:2012-07-06 04:30:45

标签: iphone objective-c ios

我创建了一个接受可变参数的方法,比如

- (NSDictionary *) getImagePixelsAtLocation: (int) locations,...NS_REQUIRES_NIL_TERMINATION

但是当我向这个类方法发送消息时,被调用方法中的位置变量值为0(我传递的参数数量无关紧要。)

该方法接收标量数据类型。我的问题是:我们可以将标量变量作为可变参数传递给方法吗?如果是的话,我做错了什么?

方法定义是:

- (NSDictionary *) getImagePixelsAtLocation: (int) pixel1,...
{
    NSMutableDictionary *dict = [NSMutableDictionary dictionary];
    va_list args;
    va_start(args, pixel1);

    //processing logic


    va_end(args);
} 

这就是我发送消息的方式:

[HSImageProcessing getImagePixelsAtLocation:1,2,nil];

1 个答案:

答案 0 :(得分:0)

实际上,你的代码中存在一个明显的明显缺陷:当一个可变参数函数以nil结尾时,接受的类型必须是一个对象。你不能将int与nil或NULL或[NSNull null]进行比较,这会破坏nil-termination的目的,并且有效地使用标准for和for-in循环来消除所有迭代的机会。另外,NSDictionary对存储非对象类型并不太满意,并且很乐意让编译器抱怨。我已经重写它以接受NSNumber *,并输出数字字典。

- (NSDictionary*) getImagePixelsAtLocation: (NSNumber*) pixel1,...
{
    NSMutableDictionary *dict = [NSMutableDictionary dictionary];
    va_list args;
    va_start(args, pixel1);

    //processing logic
    for (NSNumber* arg = pixel1; arg != nil; arg = va_arg(args, NSNumber*)) {
        [dict setObject:arg forKey:[NSString stringWithFormat:@"%i", [arg intValue]]];
    }

    va_end(args);
    return dict;
}

只需要一些额外的代码就可以使同一个呼叫同时运行:

[self getImagePixelsAtLocation:[NSNumber numberWithInt:1],[NSNumber numberWithInt:2],nil];