Objective C中有不少不定參函數,例如NSLog(format, arg1, arg2),還有字符串或數組在構造時所用的[NSString stringWithFormat: format, arg1, arg2, arg3],它們的方法原型分別是:數組
FOUNDATION_EXPORT void NSLog(NSString *format, ...) NS_FORMAT_FUNCTION(1,2); + (id)stringWithFormat:(NSString *)format, ... NS_FORMAT_FUNCTION(1,2);
- (void) doLog:(NSString *)formatStr, ... { if (!formatStr) return; va_list arglist; va_start(arglist, formatStr); NSString *outStr = [[[NSString alloc] initWithFormat:formatStr arguments:arglist] autorelease]; va_end(arglist); NSLog(@"%@", outStr); }
va_list、va_start、va_end正是處理不定參數的關鍵。函數
- (void) doLog:(NSString *)formatStr, ... { if (!formatStr) return; va_list arglist; va_start(arglist, formatStr); id arg; while(arg = va_arg(arglist, id)) { if (arg) NSLog(@"%@", arg); } va_end(arglist); }
va_list argList:定義一個指向個數可變的參數列表指針。 va_start(argList, statement):使參數列表指針arg_ptr指向函數參數列表中的第一個可選參數。 argN是位於第一個可選參數以前的固定參數,或者說是最後一個固定參數,即…以前的那個參數,函數參數列表中參數在內存中的順序與函數聲明時的順序是一致的。若是有一個va函數的聲明是void va_test(char a, char b, char c, …),則它的固定參數依次是a,b,c,最後一個固定參數argN爲c,所以就是va_start(arg_ptr, c)。 va_arg(argList, id):返回參數列表中指針arg_ptr所指的參數,返回類型爲type,並使指針arg_ptr指向參數列表中的下一個參數。 va_end(arg_ptr):清空參數列表,並置參數指針arg_ptr無效。指針
在調用的時候要在參數結尾加上nil,最後一個nil能讓va_arg取參數時碰到nil則判定爲NO,終止循環。code