2012-07-06 63 views
0

我已经创建了一个接受可变参数一样Variadic args。如何可变参数ARGS传递给

- (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

u能请添加方法声明或全法码。 – 2012-07-06 04:34:18

+0

我刚刚测试过,它对我来说工作得很好。顺便说一句,将nil传递给期望int的东西没有多大意义。 – 2012-07-06 04:47:42

+0

如果您担心它,只需将参数类型更改为接受NSIntegers。 – CodaFi 2012-07-06 04:53:52

回答

0

其实,有你的代码中有一个昭然若揭的缺陷:当一个可变参数函数是零终止的,接受的类型必须是一个对象。你不能将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]; 
+0

而且这个丑陋的代码将会变得更干净[http://clang.llvm.org/docs/ObjectiveCLiterals.html]:'[self getImagePixelsAtLocation:@ 1,@ 2,nil]'。或者,[你可以*用'int's](http://en.wikipedia.org/wiki/Stdarg.h)来做到这一点,但是你需要终止零(或'INT_MAX',或者您选择的其他一些哨点值)。 – rickster 2012-07-06 05:19:16

+0

以零结尾是危险的,因为可能通过的结果实际上是零。另外,零是***不是零,***是为id类型。另外,你对文字的理解是完全正确的,但是我想在我跳入2.1之前尽可能长时间地保持ObjC 2.0的气味; P(也就是说,他可能无法访问Xcode 4.5 ......) – CodaFi 2012-07-06 05:20:46

相关问题