通过哨兵参数实现,相当于nil.

1.c语言中

#import <stdio.h>
#import <stdarg.h> int addemUp(int firstNum,...)
{
va_list args;//指向参数的指针
int sum = firstNum;
int number; va_start(args, firstNum);//firstNum是...前1个参数
while(1)
{
number = va_arg(args, int);//返回参数列表中指针args所指的参数,返回类型为type,并使指针args指向参数列表中下一个参数。
printf("number = %d\n",number);
sum += number;//求和
if (number == 0)
{
break;
}
}
va_end(args);//清空参数列表,并置参数指针args无效
return sum; } int main(int argc, const char * argv[])
{
printf("sum of %d\n",addemUp(1,2,3,4,5,0));
return 0;
}

于是哨兵参数(sentinel)这个东西就出来了。上面例子中最后一个参数0就是一个哨兵参数,它的作用就是告诉函数没有参数了。这也是为什么ObjC中[NSArray arrayWithObjects: ...,nil]最后必须以nil参数结尾的原因。
使用__attribute__((sentinel))语法可以告诉编译器这是一个需要哨兵参数的函数。

#import <stdio.h>
#import <stdarg.h> void printString(char *first,...) __attribute__((sentinel)); void printString(char *first,...)
{
va_list args;
va_start(args,first);
char *string = first;
while (string != nil)
{
printf("%s",string);
string = va_arg(args, char *);
printf("\n");
}
va_end(args);
printf("\n");
} int main(int argc, const char * argv[])
{
printString("spicy","pony",nil);
return 0;
}

-(void)setTitleWithString:(NSString *)title,... __attribute__((sentinel))
{
NSMutableArray *argsArray = [[NSMutableArray alloc]init];
if(title)
{
[argsArray addObject:title]; va_list params;        //定义一个指向个数可变的参数列表指针
va_start(params,title);    //va_start  得到第一个可变参数地址
NSString *arg;
while((arg = va_arg(params, NSString *)))//va_arg 指向下一个参数地址
{
if(arg)
{
[argsArray addObject:arg];
}
}
va_end(params);        //置空
} for(NSString *s in argsArray)
{
NSLog(@"%@",s);
} } http://www.cnblogs.com/huen/p/3528156.html

OC中实现可变参数的更多相关文章

  1. C# 中的可变参数方法(VarArgs)

    首先需要明确一点:这里提到的可变参数方法,指的是具有 CallingConventions.VarArgs 调用约定的方法,而不是包含 params 参数的方法.可以通过MethodBase.Call ...

  2. Java中的可变参数以及foreach语句

    Java中的可变参数的定义格式如下: 返回值类型  方法名称(类型 ... 参数名称){} foreach语句的格式如下: for ( 数据类型  变量名称 :数据名称){ ... } public ...

  3. [BS-18] 对OC中不可变类的理解

    对OC中不可变类的理解 OC中存在很多不可变的类(如NSString,NSAttributedString,NSArray,NSDictionary,NSSet等),用它们创建的对象存在于堆内存中,但 ...

  4. 【转】C,C++中使用可变参数

    可变参数即表示参数个数可以变化,可多可少,也表示参数的类型也可以变化,可以是 int,double还可以是char*,类,结构体等等.可变参数是实现printf(),sprintf()等函数的关键之处 ...

  5. 关于Retrofit网络请求URL中含有可变参数的处理

    开题:在此默认各位看官对Retrofit.以及Okhttp已经有过一定的了解及应用,所以今天我们不谈基础入门的东西,今天我们谈在Retrofit请求接口管理类中URL参数含有动态参数的处理方式.一般我 ...

  6. [C++]C,C++中使用可变参数

    可变参数即表示参数个数可以变化,可多可少,也表示参数的类型也可以变化,可以是int,double还可以是char*,类,结构体等等.可变参数是实现printf(),sprintf()等函数的关键之处, ...

  7. C语言中的可变参数-printf的实现原理

    C语言中的可变参数-printf的实现原理 在C/C++中,对函数参数的扫描是从后向前的.C/C++的函数参数是通过压入堆栈的方式来给函数传参数的(堆栈是一种先进后出的数据结构),最先压入的参数最后出 ...

  8. Java中的可变参数

    1.什么是可变参数 可变参数是JDK1.5的新特性,允许一个方式接受任意数量的参数 public static void main(String[] args) { print("a&quo ...

  9. [集合]java中的 可变参数

    可变的参数类型,也称为不定参数类型.英文缩写是varargus,还原一下就是variable argument type.通过它的名字可以很直接地看出来,这个方法在接收参数的时候,个数是不定的. pu ...

随机推荐

  1. win10 uwp unix timestamp 时间戳 转 DateTime

    有时候需要把网络的 unix timestamp 转为 C# 的 DateTime ,在 UWP 可以如何转换? 转换函数可以使用下面的代码 private static DateTime UnixT ...

  2. [转]C# 关闭嵌在程序中的word进程而不关闭用户通过word手动打开的word进程

    命名空间 :System.Diagnostics 以前在word的时候,经常碰到word进程产生一大堆,怕关错了,把用户自己打开的word也关闭,一直搞忽悠,今天上网花了10块钱,下了个文件,给我了一 ...

  3. day-01mysql数据库下载安装卸载及基本操作

    MySQL5.5.40破解版地址(永久有效):链接:https://pan.baidu.com/s/1n-sODjoCdeSGP8bDGxl23Q 密码:qjjy 第2节 数据库的介绍 MySQL:开 ...

  4. oracle数据库逐步学习总结【基础二】

    原创作品,转载请在文字开头明显位置注明出处:https://www.cnblogs.com/sunshine5683/p/10067872.html 接着上一篇,继续总结! 五.oracle表管理 首 ...

  5. Java对象的内存(一)

    前言 新人一枚,刚刚入门编程不久,各方面都在学习当中,博文有什么错误的地方,希望我们可以多多交流! 最近,在开发App后台过程中,需要将项目部署到云服务器上.而云服务器的内存大小却只有1G.要如何做到 ...

  6. MVC 导出Execl 的总结几种方式 (四)

    这种方式我个人还是比较喜欢的,使用部分视图的方式,导出Execl 这样在编辑样式上也是很方便的 第一步: 编辑导出视图页 @using H5UpdateImage.Models; @{ Layout ...

  7. jquery之Ajax(一)

    1. load( url, [data], [callback] ) :载入远程 HTML 文件代码并插入至 DOM 中. url (String) : 请求的HTML页的URL地址. data (M ...

  8. JS实现点击参数面板按钮显示或隐藏数据

    当报表中列出数据太多时,想通过显示按钮隐藏明细数据只显示统计数据.如下图示例,那么该如何实现呢?本文以FineReport为例,来讲述JS如何实现点击参数面板按钮显示或隐藏数据. 打开报表 在参数面板 ...

  9. SLAM会被深度学习方法取代吗?

    日益感觉到自己对深度学习的理解比较肤浅,这段且当做是以前的认识. 上上周去围观了泡泡机器人和AR酱联合举办的论坛.在圆桌阶段,章国峰老师提了一个问题:SLAM会被深度学习方法取代吗?这是一个很有趣的话 ...

  10. js获取当前页面url信息方法(JS获取当前网址信息)

    设置或获取对象指定的文件名或路径. alert(window.location.pathname) 设置或获取整个 URL 为字符串. alert(window.location.href); 设置或 ...