之前看到UIALertView,在传递按钮的个数时,...NS_REQUIRES_NIL_TERMINATION,只知道这个可以传入多个参数,没有仔细看这个传入的参数是怎么拿到的。
- (instancetype)initWithTitle:(nullable NSString *)title message:(nullable NSString *)message delegate:(nullable id /*<UIAlertViewDelegate>*/)delegate cancelButtonTitle:(nullable NSString *)cancelButtonTit
var_list是C语言中处理变参问题的一种方式,主要涉及到几个宏,
- var_list,主要是存储多参的信息,比如,参数的起始地址
- va_start,主要是用于初始化var_list
- va_arg,主要是用来获取参数列表的参数
- va_end,结束参数获取
/*iOS实现传递不定长的多个参数的方法是使用va_list。va_list是C语言提供的处理变长参数的一种方法。在调用的时候要在参 数结尾的时候加nil
va_list的使用需要注意:
1.首先在函数里定义va_list型的变量,这个变量是指向参数的指针;
2.然后用va_start初始化刚定义的va_list变量;
3.然后用va_arg返回可变的参数,va_arg的第二个参数是你要返回的参数的类型.如果函数有多个可变参数的,依次调用va_arg获取各个参数;
4.最后用va_end宏结束可变参数的获取
NS_REQUIRES_NIL_TERMINATION,是一个宏,用于编译时非nil结尾的检查。 调用时要以nil结尾,否则会崩溃。
*/
-(void)testMoreCanshu:(NSString*)str,...NS_REQUIRES_NIL_TERMINATION{
//va_list 是一个指针变量 本质上是一个指针
va_list arg_lists;
//初始化 va_list
va_start(arg_lists, str);
NSString * obj = nil;
//va_arg(arg_lists, NSString*)用户来获取值
while((obj=va_arg(arg_lists, NSString*))){
NSLog(@"%@",obj);
};
//结束参数获取
va_end(arg_lists);
}
- (void)viewDidLoad {
[super viewDidLoad];
[self testMoreCanshu:@"bac",@"2", nil];
}
参考学习博客: