在OC的UIAlertView中存在下列方法:
- (instancetype)initWithTitle:(nullable NSString *)title message:(nullable NSString *)message delegate:(nullable id /*<UIAlertViewDelegate>*/)delegate cancelButtonTitle:(nullable NSString *)cancelButtonTitle otherButtonTitles:(nullable NSString *)otherButtonTitles, ...
其中(nullable NSString *)otherButtonTitles, ...即是数目可变的变元参数,往深处思考,就不可避免的想到:系统是如何获取数目可变的参数的?
我们知道不论变量常量都必定在其所分配的地址区,由此可以推断,系统必定是通过某种方式,获得数目可变的变元参数内的每个参数的地址来获取所有参数的。具体操作实现如下:
- (void)changeableParameters:(NSString *)format,...{
NSParameterAssert(format != nil);
va_list args;
//VA_LIST 是在C语言中解决变参问题的一组宏,所在头文件:#include <stdarg.h>,用于获取不确定个数的参数
NSString *str;
if (format) {
NSLog(@"format:%@",format);
va_start(args, format);
//va_start,函数名称,读取可变参数的过程其实就是在堆栈中,使用指针,遍历堆栈段中的参数列表,从低地址到高地址一个一个地把参数内容读出来的过程·
while (( str = va_arg(args, NSString *))) {
//va_arg,这个宏被展开成一个包含值为ap,类型为type的表达式。
NSLog(@"str:%@",str);
}
}
NSLog(@"str2:%@",str);
va_end(args);
//宏va_arg()、va_start()和va_end()一起使用,便可以完成向函数传入数目可变的变元操作。取可变数目变元的典型例子是函数printf()。类型va_list是在<stdarg.h>中定义的。
}