使用va_list获取EXC_BAD_ACCESS

时间:2011-03-18 17:31:29

标签: objective-c ios

按照文章http://cocoawithlove.com/2009/05/variable-argument-lists-in-cocoa.html中的示例,我已经编写了一些自定义处理变量参数方法的方法,以便将它们转发给另一种方法。

- (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 。所以我尝试从NSDictionary的参数中删除nil

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

再次例外。现在我从initWithObjectsAndKeys:获得了无效参数的例外。

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

2 个答案:

答案 0 :(得分: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];

答案 1 :(得分:2)

  

如果存在某种方式,我会徘徊   只是将变量参数转发给   另一种方法?

不 - Passing an ellipsis to another variadic function

这就是为什么这些功能/方法很少见(感谢上帝)。