OC可变参数:
- (void)executeSql:(NSString *)sql,... __attribute__((sentinel)){ NSMutableString *result = [NSMutableString stringWithFormat:@"%@",sql]; va_list params;//定义一个指向个数可变的参数列表指针 va_start(params,sql);//va_start 得到第一个可变参数地址 NSString *arg; while((arg = va_arg(params, NSString *))){ //va_arg 指向下一个参数地址 if(arg){ [result appendFormat:@" %@",arg]; } } va_end(params);//置空 NSLog(@"%@",result); }
调用: [self executeSql:@"select * from test",@"where" ,@"age =",@"12",nil];
使用__attribute__((sentinel))语法可以告诉编译器这是一个需要哨兵参数的函数。它的作用就是告诉函数没有参数了。这也是为什么ObjC中[NSArray arrayWithObjects: ...,nil]最后必须以nil参数结尾的原因