当我们的方法或者函数需要传入多个不确定参数时, 我们一般使用,...的形式表示,当要取传入的参数的值时就需要用到va_arg宏去取
- (void)viewDidLoad {
[super viewDidLoad];
[self testMethod:@"999",@"dsd",[Person new]];
}
- (void)testMethod:(NSString *)test,...{
va_list argList;
va_start(argList, test);
{
NSLog(@"id = %@",va_arg(argList, id));
NSLog(@"id = %@",va_arg(argList, id));
}
va_end(argList);
}
可以看到打印的结果为
2018-08-31 10:46:06.729580+0800 003TEST[2212:79126] id = dsd
2018-08-31 10:46:06.729722+0800 003TEST[2212:79126] id =
因此可以知道, va_arg取参数是从第二个开始取的,如果继续取值打印,则会崩溃,报空指针异常。
一般通常写法是传入参数时,最后一个参数设置为nil, 然后可循环遍历到nil时结束
- (void)viewDidLoad {
[super viewDidLoad];
[self testMethod:@"999",@"dsd",[Person new],nil];
}
- (void)testMethod:(NSString *)test,...{
va_list argList;
va_start(argList, test);
{
for (id params = test; params != nil; params = va_arg(argList, id)){
NSLog(@"id = %@---class = %@",params,NSStringFromClass([params class]));
}
}
va_end(argList);
}
打印结果为
2018-08-31 10:56:42.473372+0800 003TEST[2445:89009] id = 999---class = __NSCFConstantString
2018-08-31 10:56:42.473502+0800 003TEST[2445:89009] id = dsd---class = __NSCFConstantString
2018-08-31 10:56:42.473621+0800 003TEST[2445:89009] id = ---class = Person