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:, , 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/
本文版权归作者和博客园共有,欢迎转载,但须保留此段声明,并给出原文链接,谢谢合作!
ios开发-Object-C可变参数函数的更多相关文章
- Swift开发第十篇——可变参数函数&初始化方法顺序
本篇分为两部分: 一.Swift中的可变参数函数 二.初始化方法的顺序 一.Swift中的可变参数函数 可变参数函数指的是可以接受任意多个参数的函数,在 OC 中,拼接字符串的函数就属于可变参数函数 ...
- C语言可变参数函数的编写
1. 引言 C语言我们接触的第一个库函数是 printf(“hello,world!”);其参数个数为1个. 然后,我们会接触到诸如: printf(“a=%d,b=%s,c=%c”,a,b,c);此 ...
- 通过Java发射机制调用可变参数函数
1.获取可变参数的函数 获取可变参数的函数与获取参数类型为数组类型一样. clazz.getMethod("test", Object[].class); 其中O ...
- C语言学习020:可变参数函数
顾名思义,可变参数函数就是参数数量可变的函数,即函数的参数数量是不确定的,比如方法getnumbertotal()我们即可以传递一个参数,也可以传递5个.6个参数 #include <stdio ...
- C语言中可变参数函数实现原理
C函数调用的栈结构 可变参数函数的实现与函数调用的栈结构密切相关,正常情况下C的函数参数入栈规则为__stdcall, 它是从右到左的,即函数中的最右边的参数最先入栈.例如,对于函数: void fu ...
- C可变参数函数 实现
转自:http://blog.csdn.net/weiwangchao_/article/details/4857567 C函数要在程序中用到以下这些宏: void va_start( va_list ...
- C语言可变参数函数实现原理
一.可变参数函数实现原理 C函数调用的栈结构: 可变参数函数的实现与函数调用的栈结构密切相关,正常情况下C的函数参数入栈规则为__stdcall, 它是从右到左的,即函数中的最右边的参数最先入栈. 本 ...
- c可变参数函数
C函数要在程序中用到以下这些宏: <pre lang="c" escaped="true">void va_start( va_list arg_p ...
- 【转】C/C++中可变参数函数的实现
转自:http://www.cnblogs.com/cylee025/archive/2011/05/23/2054792.html 在C语言的stdarg.h头文件中提供了三个函数va_start, ...
随机推荐
- Codeforces Beta Round #9 (Div. 2 Only) B. Running Student 水题
B. Running Student 题目连接: http://www.codeforces.com/contest/9/problem/B Description And again a misfo ...
- JSP myecplise项目移植到ecplise
把myecplise项目移植到ecplise的一些细节: 参考于http://www.cnblogs.com/liushuijinger/p/3396063.html 因为个人需要,需要把JSP项目从 ...
- Cocos2d-x3.0 解压zip
2dx3.0为我们集成了unzip库,帮助我们实现对文件的解压,但使用起来略显复杂我这里封装了一个解压工具库.分享一下. 工具类下载:http://download.csdn.net/detail/q ...
- PHP正则表达式30分钟入门教程
正则表达式30分钟入门教程 三个常用的知识点: 1.惰性匹配:正则引擎默认是贪婪的,若要最少重复的话,需要用到惰性匹配符 “?” 懒惰限定符 代码/语法 说明 *? 重复任意次,但尽可能少重复 +? ...
- spring boot配置springMVC拦截器
spring boot通过配置springMVC拦截器 配置拦截器比较简单, spring boot配置拦截器, 重写preHandle方法. 1.配置拦截器: 2重写方法 这样就实现了拦截器. 其中 ...
- 使用hadoop实现关联商品统计
转载请注明出处:http://blog.csdn.net/xiaojimanman/article/details/40184581 近期几天一直在看hadoop相关的书籍,眼下略微有点感觉,自己就仿 ...
- js数组的使用
1.创建: var arr=Array(); 2.遍历: for(var arg in arr){ alert(arr[arg]); } 3.追加 arr1.concat(arr2) 4.元素删除 d ...
- python接口自动化8-参数化
前言 前面一篇实现了参数的关联,那种只是记流水账的完成功能,不便于维护,也没什么可读性,接下来这篇可以把每一个动作写成一个函数,这样更方便了. 参数化的思维只需记住一点:不要写死 (由于博客园登录机制 ...
- Singleton 单例模式(懒汉方式和饿汉方式)
单例模式的概念: 单例模式的意思就是只有一个实例.单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例.这个类称为单例类. 关键点: 1)一个类只有一个实例 这是最基本 ...
- Node 多进程并发控制小模块 - lockman
介绍 lockman 是一个用于多进程的并发控制锁, 类似一些语言中(比如 C#)的 lock 关键字可以用来确保代码块完成运行,而不会被其他进程中断.它可以把一段代码定义为互斥段(critical ...