当前位置: 首页 > 科技观察

Object-C中编写省略参数的多参函数

时间:2023-03-20 20:17:39 科技观察

在Object-C中写一个省略参数的多参数函数Uncertain,由程序员自由控制,广泛用于初始化数组、字典等。那么,这类函数是如何实现的呢?我们如何编写自己的省略参数的函数?当然,这不是处理多参数函数的唯一方法,你还可以通过字典或数组来传递参数。但是C提供的这样的机制无疑是最方便的。1、理解几个概念va_listC语言中定义了一个指针,用来指向当前参数。宏va_start(ap,param)是一个初始化参数列表,其中第一个参数是va_list对象,第二个参数是参数列表的第一个参数。va_arg(ap,type)是一个用来提取参数的宏。这个宏的第一个参数是一个va_list对象,第二个参数是要提取的参数类型。宏va_end(ap)用于关闭参数列表。2.多参数函数的取参原理在编写我们自己的多参数函数之前,了解函数的取参原理是非常重要的。放入我们内存的栈段,放入的顺序是从后往前。例如,如果一个函数参数如下:voidfunc(inta,intb,intc,intd),那么在传递参数时,参数d先入栈,然后是c,b,a。这样,在取参数的时候,根据栈的取值原则,取值顺序为a,b,c,d。所以原则上只要知道第一个参数的地址和每个参数的类型,就可以取出所有的参数。而上面介绍的几个宏就是帮助我们做到这一点的。3、多参数函数省略参数的声明和实现“...”这个符号就是我们用来实现省略参数函数的符号。例如,我们模拟实现一个日志函数如下:12345678910-(void)myLog:(NSString*)str,...{//省略参数的写法va_listlist;//创建一个列表指针对象va_start(list,str);//初始化列表,str为省略前的第一个参数,省略前的参数...NSString*temStr=str;while(temStr!=nil){//如果不为nil,继续取值NSLog(@"%@",temStr);temStr=va_arg(list,NSString*);//返回得到的值,并让指针指向下一个参数的地址}va_end(list);//关闭链表指针}注意调用的时候一定要加上nil到参数***来判断结束条件:?1[selfmyLog:@"312",@"321",无];//一定要有nil4、细心点的你可能已经发现,这里的nil是我们调用函数的时候手动加上的,但是当我们调用系统的很多函数的时候,系统直接在参数的末尾加上对我们来说那个nil,比如NSArray*array=[NSArrayarrayWithObjects:(id),nil]这是怎么做到的?我们只需要在函数的声明中加入一个宏就可以实现这个功能。修改如下:?12345678910-(void)myLog:(NSString*)str,...NS_REQUIRES_NIL_TERMINATION{//这里添加一个宏va_list列表;va_start(列表,海峡);NSString*temStr=str;while(temStr!=nil){NSLog(@"%@",temStr);temStr=va_arg(list,NSString*);}va_end(列表);}顾名思义,这个宏的作用就是在末尾位置加上我们需要的nil。