我创建了一个接受可变参数的方法,比如
- (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];
答案 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];