我們在使用蘋果官方的文檔的時候會發(fā)現(xiàn)可傳不定數(shù)的參數(shù)例如:
UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"title" message:@"message" delegate:self cancelButtonTitle:@"cancel" otherButtonTitles:@"other1",@"other2",@"other3", nil ];
[alert show];
這時你會發(fā)現(xiàn) 最后一個參數(shù)蘋果會這樣寫 并且給你提示 ... 并以nil結尾
otherButtonTitles:<#(nullable NSString *), ...#>, nil
我們自己寫的時候怎么做到這種效果的提示呢 签夭? 又怎么獲取里面的參數(shù)呢峡懈?
如下我們自己寫一個這樣的方法并獲取參數(shù)
- (void)viewDidLoad
{
[super viewDidLoad];
[self testMutableParamList:@"first",@"second",@"third",@"fourth",nil];
}
/*iOS實現(xiàn)傳遞不定長的多個參數(shù)的方法是使用va_list座硕。va_list是C語言提供的處理變長參數(shù)的一種方法亩钟。在調(diào)用的時候要在參 數(shù)結尾的時候加nil
va_list的使用需要注意:
1.首先在函數(shù)里定義va_list型的變量被因,這個變量是指向參數(shù)的指針马僻;
2.然后用va_start初始化剛定義的va_list變量还最;
3.然后用va_arg返回可變的參數(shù),va_arg的第二個參數(shù)是你要返回的參數(shù)的類型.如果函數(shù)有多個可變參數(shù)的塌碌,依次調(diào)用va_arg獲取各個參數(shù);
4.最后用va_end宏結束可變參數(shù)的獲取
NS_REQUIRES_NIL_TERMINATION旬盯,是一個宏台妆,用于編譯時非nil結尾的檢查。 調(diào)用時要以nil結尾胖翰,否則會崩潰接剩。
*/
- (void)testMutableParamList:(NSString *)fistPara, ...NS_REQUIRES_NIL_TERMINATION
{
//1.定義一個指向個數(shù)可變的參數(shù)列表指針;
va_list arguments;
id eachObject;
if (fistPara)
{
NSLog(@"%@",fistPara);
//2.va_start(arguments, fistPara); fistPara為第一個參數(shù)萨咳,也就是最右邊的已知參數(shù),這里就是獲取第一個可選參數(shù)的地址.使參數(shù)列表指針指向函數(shù)參數(shù)列表中的第一個可選參數(shù)懊缺,函數(shù)參數(shù)列表中參數(shù)在內(nèi)存中的順序與函數(shù)聲明時的順序是一致的。
va_start(arguments, fistPara);
//依次取得除第一個參數(shù)以外的參數(shù)
//3.va_arg(arguments,id):返回參數(shù)列表中指針所指的參數(shù)培他,返回類型為id鹃两,并使參數(shù)指針指向參數(shù)列表中下一個參數(shù)。
while ((eachObject = va_arg(arguments, id)))
{
NSLog(@"%@",eachObject);
}
//5.清空參數(shù)列表舀凛,并置參數(shù)指針args無效俊扳。
va_end(arguments);
}
}