iOS開發可變引數va_list、va_start、va_end
阿新 • • 發佈:2019-02-02
iOS 可變引數(va_list,va_start,va_end)
例如:UIAlertView的init方法中的otherButtonTitles:(NSString *)otherButtonTitles, ... NS_REQUIRES_NIL_TERMINATION等多個可變引數
NSString的initWithFormat:(NSString *)format, ...等多個可變引數
iOS實現傳遞不定長的多個引數的方法是使用va_list。va_list是C語言提供的處理變長引數的一種方法。在呼叫的時候要在引數結尾的時候加nil。va_list的使用需要注意:
(1)首先在函式裡定義va_list型的變數,這個變數是指向引數的指標;
(2)然後用va_start初始化剛定義的va_list變數;
(3)然後用va_arg返回可變的引數,va_arg的第二個引數是你要返回的引數的型別.如果函式有多個可變引數的,依次呼叫va_arg獲取各個引數;
(4)最後用va_end巨集結束可變引數的獲取。
舉個例子:
+ (void)functionName:(NSString *)string, ... { va_list args; va_start(args, string); if (string) { NSString *otherString; while ((otherString = va_arg(args, NSString *))) { //依次取得所有引數 } } va_end(args); }
- (id)initWithViewControllers:(UIViewController *)firstViewController, ... { self = [self initWithNibName:nil bundle:nil]; if (self) { id eachObject; va_list argumentList; NSMutableArray *mutableArray = [[NSMutableArray alloc] init]; if (firstViewController) // The first argument isn't part of the varargs list, { // so we'll handle it separately. [mutableArray addObject:firstViewController]; va_start(argumentList, firstViewController); // Start scanning for arguments after firstViewController. while ((eachObject = va_arg(argumentList, id))) // As many times as we can get an argument of type "id" [mutableArray addObject:eachObject]; // that isn't nil, add it to self's contents. va_end(argumentList); } XLSwipeContainerController * containerController = [[XLSwipeContainerController alloc] initWithViewControllers:mutableArray]; [self setViewControllers:@[containerController]]; } return self; }
說明:
va_list args://定義一個指向個數可變的引數列表指標;
va_start(args,string)://string為第一個引數,也就是最右邊的已知引數,這裡就是獲取第一個可選引數的地址.使引數列表指標指向函式引數列表中的第一個可選引數,函式引數列表中引數在記憶體中的順序與函式宣告時的順序是一致的。
va_arg(args,NSString):返回引數列表中指標所指的引數,返回型別為NSString,並使引數指標指向引數列表中下一個引數。
va_end(args):清空引數列表,並置引數指標args無效