0

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

- (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];
4

1 回答 1

0

实际上,您的代码中有一个明显的缺陷:当可变参数函数以 nil 终止时,接受的类型必须是对象。您不能将 int 与 nil 或 NULL 或 [NSNull null] 进行比较,这违背了 nil 终止的目的,并有效地挫败了使用标准 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];
于 2012-07-06T05:12:40.673 回答