iOS开发-Object-C可变参数函数

简介

一个可变参数函数是指一个函数拥有不定的参数,即为一个函数可接收多个参数。有时我们会遇到一些算术问题需要用到,比如是计算传入参数的总和,字符串的连接或是其它操作过程,我们在 OC 里也经常使用,最经典的就是 NSLog( C 为 printf ) ,它可以指定格式的输出,格式化输出的内容。

 

现在我们先来看看普通函数的定义方法。

 

 

普通函数

一般我们定义的函数都是指定有多少个参数,如果是有三个参数,我们可以这样写。

- (void)exampleObj:(NSString *)obj obj2:(NSString *)obj2 obj3:(NSString *)obj3
{
    
}

这样有一个问题,如果我们需要计算值,比如需要计算5个或10个数值相加的运行,那我们在函数里是不是需要定义5个或10个的参数?如果有100个数值需要计算 …… 。

 

 

可变参数函数

现在,我们可以通过定义 可变参数函数 去实现刚刚的问题,比如我们现在需要传进来参数的数值之和,而且传的参数个数是不固定的。可变参数函数的定义方法很简单,我们在参数的后面加上 ", ..."就可以了,例如。

- (void)exampleObj:(NSString *)obj obj2:(NSString *)obj2 obj3:(NSString *)obj3, ...
{
    
}

 

现在,我们回到刚刚的难题,这个函数主要是用来计算用户传进来的数值之和。

- (int)sum:(int)num, ...
{
    int result = num;
    int objNum;
    
    va_list arg_list;
    va_start(arg_list, num);
    while ((objNum = va_arg(arg_list, int))) {
        result += objNum;
    }
    va_end(arg_list);
    return result;
}

va_list:用来保存宏 va_start 、va_arg 和 va_end 所需信息的一种类型。为了访问变长参数列表中的参数,必须声明 va_list 类型的一个对象。

va_start:访问变长参数列表中的参数之前使用的宏,它初始化用 va_list 声明的对象,初始化结果供宏va_arg和va_end使用;

va_arg:展开成一个表达式的宏,该表达式具有变长参数列表中下一个参数的值和类型。每次调用 va_arg 都会修改,用 va_list 声明的对象从而使该对象指向参数列表中的下一个参数。

va_end:该宏使程序能够从变长参数列表用宏 va_start 引用的函数中正常返回。

 

使用方法

使用方法也很简单,在可变参数里,所有参数均用逗号隔开。

NSLog(@"%d", [self sum:1, 34, nil]);

 

 

注意事项

使用的时候,可变参后最后面加一个nil值,这样是代表结束的意思。就像UIAlertView初始化的那样,它一开始不知道你有多少个Button,你可以自由地往里加Button,最后也是由一个nil结束,所以两个是一样的道理。

 

 

注意点

1)当我们要创建一个可变参数函数时,必须把省略号( ... )放到参数列表后面,同时也只能拥有一个这样的格式,因为我们不能定义两个可变的参数。

2)当我们需要读取 可变参数列表 时,必须先指定一个变数 va_list ,然后使用宏 va_start 、va_arg、va_end 来获取。

 

 

参考:

C可变参数函数 实现 —— http://blog.csdn.net/weiwangchao_/article/details/4857567

维基百科.可變參數函數 —— http://zh.wikipedia.org/wiki/可變參數函數

 

 


博文作者:GarveyCalvin

博文出处:http://www.cnblogs.com/GarveyCalvin/

本文版权归作者和博客园共有,欢迎转载,但须保留此段声明,并给出原文链接,谢谢合作!

 

posted @ 2015-03-13 20:07  GarveyCalvin  阅读(3957)  评论(0编辑  收藏  举报