按照文章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:
获得了无效参数的例外。
我想知道是否存在将变量参数转发给另一种方法的某种方式?
答案 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。
这就是为什么这些功能/方法很少见(感谢上帝)。