形参个数可变
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);
}