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

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

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值