簡介函數
一個可變參數函數是指一個函數擁有不定的參數,即爲一個函數可接收多個參數。有時咱們會遇到一些算術問題須要用到,好比是計算傳入參數的總和,字符串的鏈接或是其它操做過程,咱們在 OC 裏也常常使用,最經典的就是 NSLog( C 爲 printf ) ,它能夠指定格式的輸出,格式化輸出的內容。spa
如今咱們先來看看普通函數的定義方法。.net
普通函數code
通常咱們定義的函數都是指定有多少個參數,若是是有三個參數,咱們能夠這樣寫。對象
- (void)exampleObj:(NSString *)obj obj2:(NSString *)obj2 obj3:(NSString *)obj3 { }
這樣有一個問題,若是咱們須要計算值,好比須要計算5個或10個數值相加的運行,那咱們在函數裏是否是須要定義5個或10個的參數?若是有100個數值須要計算 …… 。blog
可變參數函數ip
如今,咱們能夠經過定義 可變參數函數 去實現剛剛的問題,好比咱們如今須要傳進來參數的數值之和,並且傳的參數個數是不固定的。可變參數函數的定義方法很簡單,咱們在參數的後面加上 ", ..."就能夠了,例如。字符串
- (void)exampleObj:(NSString *)obj obj2:(NSString *)obj2 obj3:(NSString *)obj3, ... { }
如今,咱們回到剛剛的難題,這個函數主要是用來計算用戶傳進來的數值之和。get
- (int)sum:(int)num, ... { int result = num; int objNum; va_list arg_list; va_start(arg_list, num); while ((objNum = va_arg(arg_list, int))) { result += objNum; } va_end(arg_list); return result; }
va_list:用來保存宏 va_start 、va_arg 和 va_end 所需信息的一種類型。爲了訪問變長參數列表中的參數,必須聲明 va_list 類型的一個對象。博客
va_start:訪問變長參數列表中的參數以前使用的宏,它初始化用 va_list 聲明的對象,初始化結果供宏va_arg和va_end使用;
va_arg:展開成一個表達式的宏,該表達式具備變長參數列表中下一個參數的值和類型。每次調用 va_arg 都會修改,用 va_list 聲明的對象從而使該對象指向參數列表中的下一個參數。
va_end:該宏使程序可以從變長參數列表用宏 va_start 引用的函數中正常返回。
使用方法
使用方法也很簡單,在可變參數裏,全部參數均用逗號隔開。
NSLog(@"%d", [self sum:1, 34, nil]);
注意事項
使用的時候,可變參後最後面加一個nil值,這樣是表明結束的意思。就像UIAlertView初始化的那樣,它一開始不知道你有多少個Button,你能夠自由地往裏加Button,最後也是由一個nil結束,因此兩個是同樣的道理。
注意點
1)當咱們要建立一個可變參數函數時,必須把省略號( ... )放到參數列表後面,同時也只能擁有一個這樣的格式,由於咱們不能定義兩個可變的參數。
2)當咱們須要讀取 可變參數列表 時,必須先指定一個變數 va_list ,而後使用宏 va_start 、va_arg、va_end 來獲取。
參考:
C可變參數函數 實現 —— http://blog.csdn.net/weiwangchao_/article/details/4857567
維基百科.可變參數函數 —— http://zh.wikipedia.org/wiki/可變參數函數
博文做者:GarveyCalvin
博文出處:http://www.cnblogs.com/GarveyCalvin/
本文版權歸做者和博客園共有,歡迎轉載,但須保留此段聲明,並給出原文連接,謝謝合做!