达内首页 > IT技术学院 > C++学院 > Objective C中定义可变参函数
Objective C中定义可变参函数
作者:广州达内科技 更新时间:2013-08-05 14:35 来源:Android开发培训


Objective C中有很多不定参函数,例如NSLog(format, arg1, arg2),还有字符串或数组在构造时所用的[NSString stringWithFormat: format, arg1, arg2, arg3],它们的方法原型分别是:
FOUNDATION_EXPORT void NSLog(NSString *format, ...) NS_FORMAT_FUNCTION(1,2);
+ (id)stringWithFormat:(NSString *)format, ... NS_FORMAT_FUNCTION(1,2);
现在来看一个实际的例子:
Ios代码 
1.- (void) doLog:(NSString *)formatStr, ... {  
2.    if (!formatStr)  
3.        return;  
4.    va_list arglist;  
5.    va_start(arglist, formatStr);  
6.    NSString *outStr = [[[NSString alloc] initWithFormat:formatStr arguments:arglist] autorelease];  
7.    va_end(arglist);  
8.    NSLog(@"%@", outStr);  
9.} 
- (void) doLog:(NSString *)formatStr, ... {
    if (!formatStr)
  return;
 va_list arglist;
 va_start(arglist, formatStr);
 NSString *outStr = [[[NSString alloc] initWithFormat:formatStr arguments:arglist] autorelease];
 va_end(arglist);
 NSLog(@"%@", outStr);
}
由此可见,va_list、va_start、va_end正是处理不定参数的关键。
接下来,再来看一个例子:
Ios代码 
1.- (void) doLog:(NSString *)formatStr, ... {  
2.    if (!formatStr)  
3.        return;  
4.    va_list arglist;  
5.    va_start(arglist, formatStr);  
6.    id arg;  
7.    while(arg = va_arg(arglist, id)) {  
8.        if (arg)  
9.            NSLog(@"%@", arg);  
10.    }  
11.    va_end(arglist);  
12.} 
- (void) doLog:(NSString *)formatStr, ... {
    if (!formatStr)
  return;
 va_list arglist;
 va_start(arglist, formatStr);
 id arg;
    while(arg = va_arg(arglist, id)) {
        if (arg)
            NSLog(@"%@", arg);
    }
 va_end(arglist);
}
va_list argList:定义一个指向个数可变的参数列表指针。
va_start(argList, statement):使参数列表指针arg_ptr指向函数参数列表中的第一个可选参数。
argN是位于第一个可选参数之前的固定参数,或者说是最后一个固定参数,即…之前的那个参数,函数参数列表中参数在内存中的顺序与函数声明时的顺序是一致的。如果有一个va函数的声明是void va_test(char a, char b, char c, …),则它的固定参数依次是a,b,c,最后一个固定参数argN为c,因此就是va_start(arg_ptr, c)。
va_arg(argList, id):返回参数列表中指针arg_ptr所指的参数,返回类型为type,并使指针arg_ptr指向参数列表中的下一个参数。
va_end(arg_ptr):清空参数列表,并置参数指针arg_ptr无效。
在调用的时候要在参数结尾加上nil,最后一个nil能让va_arg取参数时碰到nil则断定为NO,终止循环。


上一篇:为什么C语言屹立不倒?
下一篇:c++初学者需要注意的5个细节

相关资讯

  • [2014-05-09 17:00:35] c++初学者需要注意的5个细节
  • [2013-08-05 14:35:40] 深度对话C++天才Andrei Alexandrescu
  • [2013-08-05 14:35:12] Objective C中定义可变参函数
  • [2013-08-05 14:33:34] 软件随想 做善于思考的码农
  • [2013-08-05 14:33:00] 适合IT经理的编程语言
  • [2013-08-05 12:09:05] 2012年1月编程语言排行榜:Objective-C成为年
  • 【2013-2月28日】
    Java 软件工程师就业班
    >>热招中!


    【2013-2月28日】
    3G-Android 工程师就业班
    >>热招中!


    【2013-2月28日】
    3G-Android 工程师周末班
    >>热招中!

    【2013-2月28日】
    软件测试 工程师就业班
    >>热招中!