ios 可變參數(va_list,va_start,va_end)


例如:UIAlertView的init方法中的otherButtonTitles:(NSString *)otherButtonTitles, ...等多個可變參數。

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:(NSObject*)string, ...   
{  
    va_list args;  
    va_start(args, string);  
    if (string)   
    {  
        NSString *otherString;  
        while ((otherString = va_arg(args, NSString *)))   
        {  
            //依次取得所有參數  
        }  
    }  
    va_end(args);  
}  

 

 

-(id)initWithViewControllers:(UIViewController<XLSwipeContainerChildItem> *)firstViewController, ...
{
    self = [self initWithNibName:nil bundle:nil];
    if (self)
    {
        self.navigationBar.tintColor = [UIColor whiteColor];
        self.navigationBar.barTintColor = iosLXSystemColor;
        self.navigationBar.barStyle = UIBarStyleBlack;
        
        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,並使參數指針指向參數列表中下一個參數。  

a_end(args):清空參數列表,並置參數指針args無效

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM