OC学习之深入c ——OC参数数目可变的变元操作

来源:互联网 发布:知乎年薪百万是什么梗 编辑:程序博客网 时间:2024/05/18 02:48

在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>中定义的。

}

0 0