关于va_arg宏的用法

当我们的方法或者函数需要传入多个不确定参数时, 我们一般使用,...的形式表示,当要取传入的参数的值时就需要用到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

你可能感兴趣的:(关于va_arg宏的用法)