Objective C中定義可變參函數

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

相關文章
相關標籤/搜索