2011-03-18 97 views
3

的EXC_BAD_ACCESS在进行第八http://cocoawithlove.com/2009/05/variable-argument-lists-in-cocoa.html样品,我写的可变参数方法的一些自定义的操作为他们转发到另一种方法。掌握的va_list

- (void) someMethod:(NSString *)name 
    wittParamsAndKeys:(id)firstParam, ... { 

va_list args; 
va_start(args, firstParam); 
NSDictionary* paramsAndKeys = 
    [[NSDictionary alloc] initWithObjectsAndKeys:firstParam, args, nil]; 
va_end(args); 

} 

,但我得到EXC_BAD_ACCESS。所以然后我试图从参数中删除nil NSDictionary:

NSDictionary* paramsAndKeys = 
    [[NSDictionary alloc] initWithObjectsAndKeys:firstParam, args]; 

再次例外。现在我对initWithObjectsAndKeys:发生了无效参数的例外。

我想知道是否存在只是将可变参数转发给另一种方法的方式?

回答

4

看到这个问题:Variadic list parameter

一般来说是不可能做到这一点。您必须解析所有参数并将它们添加到该字典中:

 NSMutableArray* values = [NSMutableArray arrayWithObject: first_param]; 
     NSMutableArray* keys = [NSMutableArray array]; 
     va_list args; 
     va_start(args, t1); 
     id arg; 
     int i = 0; 
     while ((arg = va_arg(args, id)) != nil) { 
      if((++i)%2) 
       [values addObject: arg]; 
      else 
       [keys addObject: arg]; 
     } 

NSDictionary* dict = [NSDictionary dictionaryWithObjects: values forKeys: keys]; 
+0

我很感激这个答案。我是Objective-C的新手。我对C++有深入的了解,但从来没有像“可变参数”转发那样使用特殊的C语言。 – ajukraine 2011-03-18 18:50:19

+0

@Max:你能解释一下't1'是什么变量吗? – Besi 2012-07-19 11:31:06

+0

@Besi t1是方法定义中最后一个命名参数的名称 – Max 2012-07-19 16:34:42

2

我徘徊如果存在某种方式 只是将可变参数转发到 另一种方法?

否 - Passing an ellipsis to another variadic function

这就是为什么这样的功能/方法是罕见的(谢天谢地)。

+0

此功能扩展了语言的“动态行为”。如果Objective-C被认为是动态的,我们应该遵循这种方法。 – ajukraine 2011-03-18 18:52:53

+0

我无法看到可变参数函数和动态语言之间的连接。 – hoha 2011-03-18 19:55:37

+0

为什么不能?动态的意思是“未定义一次” - 在运行期间变化。例如,我们有两种方法:一种是在编译时确定的参数列表,另一种是在调用时确定的参数列表,是不是“动态”行为? – ajukraine 2011-03-18 21:49:10