之前看到UIALertView,在传递按钮的个数时,...NS_REQUIRES_NIL_TERMINATION,只知道这个可以传入多个参数,没有仔细看这个传入的参数是怎么拿到的。
- (instancetype)initWithTitle:(nullable NSString *)title message:(nullable NSString *)message delegate:(nullable id /*<UIAlertViewDelegate>*/)delegate cancelButtonTitle:(nullable NSString *)cancelButtonTitvar_list是C语言中处理变参问题的一种方式,主要涉及到几个宏,
var_list,主要是存储多参的信息,比如,参数的起始地址va_start,主要是用于初始化var_listva_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]; }参考学习博客:
https://www.jianshu.com/p/4259ee5f6eea