object-c接收任意类型的参数:
/**
* 接收String类型的多个参数
* @param firsParam 第一个参数
*/
-(void)TestString:(NSString*)firsParam, ... {
va_list list;
va_start(list, firsParam);
NSString* param;
NSLog(@"firstParam:%@",firsParam);
while ((param = va_arg( list, NSString *)))
{
if(param){
NSLog(@">>>>>>>>>>%@",param);
}
}
va_end(list);
}
/**
* 接收任意类型的多个参数
* @param firsParam 第一个参数
*/
-(void)TestObject:(id)firsParam, ... {
va_list list;
va_start(list, firsParam);
id param;
NSLog(@"firstParam:%@",firsParam);
while ((param = va_arg( list, id)))
{
if(param){
NSLog(@">>>>>>>>>>%@",param);
}
}
va_end(list);
}
/**
* 注意:调用的时候最后一个参数必须为nil,否则会发生非常严重的错误:EXC_BAD_ACCESS
*/
-(void)test{
//[self TestString:@"7",@"9",@"5",nil];
[self TestObject:@"7",@"9",@"5",@"abc",@[@1,@5],@{@"a":@"b"},nil];
}
原理:利用 va_list va_start va_arg va_end 这几个宏来实现的.首先得到第一个参数得到第一个参数的地址,然后根据可变参数的列表指针依次遍历得到每一个参数,直到为地址为nil为止;
va_list params; //定义一个指向个数可变的参数列表指针;
va_start(params,firsParam);//va_start 得到第一个可变参数地址,
va_arg(params,id);//指向下一个参数地址
va_end(params); //置空指针