形参个数可变, NSNumber和NSValue,获得Class

来源:互联网 发布:haproxy acl 端口复用 编辑:程序博客网 时间:2024/06/04 22:40

形参个数可变

va_list 是在C语言中解决变参问题的一组宏,用于获取不确定个数的参数:用法如下:

(1)首先在函数里定义一具va_list型的变量,这个变量是指向参数的指针;
(2)然后用va_start宏初始化刚定义的va_list变量;
(3)然后用va_arg返回可变的参数,va_arg的第二个参数是你要返回的参数的类型(如果函数有多个可变参数的,依次调用va_arg获取各个参数);
(4)最后用va_end宏结束可变参数的获取。

作用:
va_start宏,获取可变参数列表的第一个参数的地址
va_arg宏,获取可变参数的当前参数,返回指定类型并将指针指向下一参数
va_end宏,清空可变参数列表

/** *   形参个数可变 */-(void)studyOne{    //我们经常使用NSLog(NSString * _Nonnull format, ...)函数,这个函数可以传入任意多个参数,这就是形参个数可变的方法.如果在定义方法时,在最后一个形参名增加逗号和三点(,...),则表示该形参可以接受多个参数值.    [self test:@"Jack",@"Jenny",@"Roy",@"Vacent",nil];}-(void)test:(NSString *)name,...{    //使用va_list定义一个argList指针变量,该指针变量指向一个可变参数列表    va_list argList;    if(name){        NSLog(@"%@",name);//Jack        //让argList指向第一个可变参数列表的第一个参数,开始获取变参数列表的第一个参数        va_start(argList, name);        //va_arg用于提取argList指针当前指向的参数,并将指针指向下一个参数, arg用于保存当前获取的参数,如果该参数不为nil,进入循环体.        NSString *arg=va_arg(argList, id);        while (arg) {            NSLog(@"%@",arg);//Jenny,Roy, Vacent            arg=va_arg(argList, id);        }        //释放argList指针,结束提取        va_end(argList);    }}

NSNumber和NSValue

/** *    NSNumber和NSValue */-(void)studyTwo{    //NSNumber和NSValue都是包装类,其中NSValue是NSNumber的父类.NSValue代表一个更加通用的包装类,它可以用于包装单个short,int,long,float,char,指针,对象id等数据项,通过该包装类,就可以把short,int,long,float,char,指针等添加到NSArray和NSSet等集合中.(这些集合要求它们的元素必须是对象).    /*     NSNumber是更加具体的包装类,主要用于包装c语言的各种数值类型,NSNumber主要的包装类型有如下3种:     - (NSNumber *)initWithxxx:该实例方法需要先创建一个NSNumber对象,再使用一个基本类型的值来初始化NSNumber.     + (NSNumber *)numberWithxxx:该类方法将直接将特定类型的值包装成为NSNumber.     -xxxValue:该实例方法返回该NSNumber对象包装的基本类型的值.     上面3类方法中的xxx可以代表int,char等各种基本类型,具体看头文件.     */    NSNumber *num=[NSNumber numberWithInt:20];    NSNumber *doubleNum=[NSNumber numberWithDouble:3.4];    //但是更喜欢使用语法糖,简单,方便,如下:    NSNumber *floatNumber=@(3.1);    NSLog(@"%@ %@ %@",num,doubleNum,floatNumber);//20 3.4 3.1}

获得Class

/** *   获得Class */-(void)studyThree{    /*      每个类都有一个对应的Class,OC中获得Class通常有如下3中方式:      1):使用  NSClassFromString(NSString * _Nonnull aClassName)函数来获取Class,该函数需要传入字符串参数,该字符串参数的值是某个类的类名.      2):调用某个类的 class 方法老获取该类对应的 Class.      3):调用某个对象的class方法,该方法是NSObject类中的一个方法+ (Class)class,所以 OC 对象都可以调用该方法,该方法将返回对象所属类对应的 Class.    */    Class class=  NSClassFromString(@"NSDate");    NSLog(@"%@",class);    id date=[[class alloc]init];    NSLog(@"%@",date);    NSLog(@"%@",[date class]);    NSLog(@"%d",class == NSDate.class);}
0 0
原创粉丝点击