1.NS_REQUIRES_NIL_TERMINATION:
NS_REQUIRES_NIL_TERMINATION 是系統(tǒng)的一個宏,他表示可以接收多個參數(shù)演熟。
比如: (這個方法只是舉個例子,目前已經(jīng)被遺棄了以政。)
UIAlertView *alert=[[UIAlertView alloc]initWithTitle:@"alert"
message:@"Alert text goes here"
delegate:self
cancelButtonTitle:@"NO"
otherButtonTitles:@"YES",@"asd" ,@"asd" ,nil];
[alert show];
他的效果
你會發(fā)現(xiàn) otherButtonTitles 接受了多個參數(shù) @"YES" @"asd" @"asd" nil
點開這個方法你會發(fā)現(xiàn)在系統(tǒng)定義的 otherButtonTitles 的參數(shù)后面跟了一個 NS_REQUIRES_NIL_TERMINATION
- (instancetype)initWithTitle:(nullable NSString *)title message:(nullable NSString *)message delegate:(nullable id /*<UIAlertViewDelegate>*/)delegate cancelButtonTitle:(nullable NSString *)cancelButtonTitle otherButtonTitles:(nullable NSString *)otherButtonTitles, ... >NS_REQUIRES_NIL_TERMINATION;
2. va_list 霸褒,va_start,va_arg盈蛮,va_end
使用多參數(shù)傳值還需要用到C語言的這幾個函數(shù)去解析
注??:這里我們接收的多個參數(shù)并不是我們所用到的 NSMutableArray 或者 NSArray废菱。所以也就不能以我們常規(guī)的取數(shù)組的方式來獲取傳過來的值
首先定一個可以接受多參的方法:
#import <UIKit/UIKit.h>
@interface ViewController : UIViewController
+(NSArray *)getNames:(NSString *)nameStr,...NS_REQUIRES_NIL_TERMINATION;
@end
實現(xiàn)1:
- (void)viewDidLoad {
[super viewDidLoad];
[self getNames:@"小米",@"小貓",@"小狗",@"小花", nil];
}
-(void)getNames:(NSString *)nameStr,...{
//1. 定義一個具有va_list型的變量
va_list args;
//2. va_start宏初始化變量剛定義的va_list變量,使其指向第一個可變參數(shù)的地址
va_start(args, nameStr);
//3. va_arg返回可變參數(shù)抖誉,第二個參數(shù)是你要返回的參數(shù)的類型
NSString *one = va_arg(args, NSString *);
NSString *two = va_arg(args, NSString *);
NSString *three = va_arg(args, NSString *);
NSLog(@"one:%@",one);
NSLog(@"two:%@",two);
NSLog(@"three:%@",three);
//4. 結(jié)束可變參數(shù)的獲取
va_end(args);
}
打印結(jié)果:
2023-03-07 11:24:30.375436+0800 test[1618:71950] one:小貓
2023-03-07 11:24:30.375559+0800 test[1618:71950] two:小狗
2023-03-07 11:24:30.375674+0800 test[1618:71950] three:小花
(lldb)
通過打印可以看到 va_arg 的取值是從第2個開始的
不符合我們的需求
實現(xiàn)2:
- (void)viewDidLoad {
[super viewDidLoad];
[self getNames:@"小米",@"小貓",@"小狗",@"小花", nil];
}
-(void)getNames:(NSString *)nameStr,...{
//1. 定義一個具有va_list型的變量
va_list args;
//2. va_start宏初始化變量剛定義的va_list變量殊轴,使其指向第一個可變參數(shù)的地址
va_start(args, nameStr);
//3. va_arg返回可變參數(shù)
for (NSString *str = nameStr; str != nil; str = va_arg(args, NSString *)) {
NSLog(@"%@",str);
}
//4. 結(jié)束可變參數(shù)的獲取
va_end(args);
}
打印結(jié)果:
2023-03-07 11:30:19.686555+0800 test[1758:77914] 小米
2023-03-07 11:30:19.686705+0800 test[1758:77914] 小貓
2023-03-07 11:30:19.686810+0800 test[1758:77914] 小狗
2023-03-07 11:30:19.686917+0800 test[1758:77914] 小花
通過打印結(jié)果,獲取到了我們?nèi)康闹?br> 第二種通過for循環(huán)中判斷是否為空來結(jié)束循環(huán)袒炉。 這也是為什么多參數(shù)傳值最后都要跟一個 nil 的原因旁理。