博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
iOS 不定参数 详解
阅读量:2395 次
发布时间:2019-05-10

本文共 1453 字,大约阅读时间需要 4 分钟。

一个可变参数函数是指一个函数拥有不定的参数,即为一个函数可接收多个参数。有时会遇到一些算术问题需要用到,比如是计算传入参数的总和,字符串的连接或是其它操作过程,在 ObjectC 里也经常使用,最经典的就是 NSLog( C 为 printf ) ,它可以指定格式的输出,格式化输出的内容
举例子
类头文件TestClass.h
#import <Foundation/Foundation.h>
@interface TestClass : NSObject
+ (void)print:(NSString *)firstArg, ... NS_REQUIRES_NIL_TERMINATION;
@end
类实现TestClass.m
#import “TestClass.h"
@implementation TestClass
+ (void)print:(NSString *)firstArg, ... NS_REQUIRES_NIL_TERMINATION
{
    if(firstArg)
    {
        
// 取出第一个参数
        NSLog(@"%@", firstArg);
        
// 定义一个指向个数可变的参数列表指针
        va_list args;
        
// 用于存放取出的参数
        NSString *arg;
        
// 初始化变量刚定义的va_list变量,这个宏的第二个参数是第一个可变参数的前一个参数,是一个固定的参数
        va_start(args, firstArg);
        
// 遍历全部参数 va_arg返回可变的参数(a_arg的第二个参数是你要返回的参数的类型)
        while ((arg = va_arg(args, NSString *))) 
        {
            NSLog(@"%@", arg);
        }
        
// 清空参数列表,并置参数指针args无效
        va_end(args);
    }
}
@end
类调用
#import <Foundation/Foundation.h>
#import "TestClass.h"
int main(int argc, const char * argv[]) {
    [TestClass print:@"a", @"b", @"c", @“d", nil];
    return 0;
}
注 : 1> 在可变参数里,所有参数均用逗号隔开
       
2> 参数结尾必须加上nil,表示参数结束
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 引用的函数中正常返回
NS_REQUIRES_NIL_TERMINATION : 是一个宏,用于编译时非nil结尾的检查
更简便实现不定参数的方法是将参数列表放入一个数组中
- (void)mutableParamList:(NSArray *)arrParam 
{
   
// do something with arrParam
}
你可能感兴趣的文章
[转]CentOS 5.4挂载可读写NTFS
查看>>
SmartChineseAnalyzer的对中文开源社区是一大贡献
查看>>
[转]Apache Mahout 简介
查看>>
[转]分布式key-value存储方案介绍:Cassandra,LightCloud,TokyoCabinet
查看>>
[转]HDFS+MapReduce+Hive+HBase十分钟快速入门
查看>>
stdlib中的xmalloc,xfree,xinit_mempool
查看>>
关于Java Advanced Imaging(JAI)的一点积累
查看>>
Spirit越狱iPhone/iPod touch/iPad 3.1.3/3.2固件(Windows)
查看>>
[转]Adobe发布Puppet Recipes for Hadoop
查看>>
[转]mysql里not in语句怎么写
查看>>
outlook 2010 突破附件大小限制
查看>>
[转][Magick++] How to convert jpg image to raw 32 bit float
查看>>
[转]数据类型 -- uint32_t 类型
查看>>
[转]C语言系统资源控制(getrlimit && setrlimit)
查看>>
[转]linux文件系统基础知识
查看>>
[转]Centos5 下安装/配置lvm使用reiserfs文件系统
查看>>
[转]Use ReiserFS in CentOS 5(lvm)
查看>>
[转]KFS的部署与简单使用
查看>>
[转]KFS官方部署手册
查看>>
[转]Ubuntu 10.04 LTS 安装 sun-java6-jdk
查看>>