2010-06-29 175 views
9

我無法理解Objective-C中多個參數的語法。我見過this question,但答案並沒有幫助我(還)。如何使用va_args傳遞參數(可變參數,省略號)

這裏是我的代碼(其實我會想最終傳遞給NSString的stringWithFormat,但得到的NSLog的工作就足夠好了):

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification { 
    // Insert code here to initialize your application 
    [self log:@"blah blah %d", 32]; 
} 


- (void)log:(NSString *)text, ... { 
     va_list args; 
     va_start(args, text); 
     NSLog(text, args); 
} 

的參數(或參數)來通過,但它有一些奇怪的值(輸出是blah blah 1606412704)。我應該如何傳遞通過...進入的值?

+0

相關,但不完全重複的:http://stackoverflow.com/questions/2345196 – 2010-06-29 19:40:44

回答

20

有一個接受va_listNSLog一個變種,叫NSLogv

- (void) log:(NSString *)text, ... { 
    va_list args; 
    va_start(args, text); 
    NSLogv(text, args); 
    va_end(args); 
} 

轉發實際...(不是va_list)的唯一方法是使用宏。例如:

#define MyLog(f, ...) { \ 
NSLog(f, ##__VA_ARGS__); \ 
[someObject doSomething:f, ##__VA_ARGS__]; \ 
} 

然而,這應該是非常謹慎使用,因爲宏可以使代碼真的混淆。

+0

這很酷和+1,但我仍然不知道如何將參數傳遞給下一個方法(或者我做對了嗎?) – 2010-06-29 20:11:23

+3

你不能。一旦將'...'轉換爲'va_list',它只能被傳遞給一個函數或一個接受'va_list'的方法,而不是一個接受可變數量參數的函數/方法。 – Yuji 2010-06-29 20:18:54

+0

@Yuji,ooooooooooooooooo lemme試試看。 – 2010-06-29 20:31:24

12

你可以使用-[NSString initWithFormat:arguments:]

- (void)log:(NSString *)text, ... 
{ 
    va_list args; 
    va_start(args, text); 
    NSString *log_msg = [[[NSString alloc] initWithFormat:text arguments:args] autorelease]; 
    NSLog(@"%@", log_msg); 
} 
+0

哇。雖然這不能回答我的問題,但它解決了我目前的問題。但是,如何將參數傳遞給下一個方法? – 2010-06-29 20:08:47

+0

您無法傳遞可變參數。您可以傳遞'args',但這意味着函數或方法必須採用'va_list'類型的對象。 – mipadi 2010-06-29 20:27:13

+1

好的,那太酷了。我結束了這樣做: - (void)log:(NSString *)text,...;和' - (void)log:(NSString *)text withArguments:(va_list)list;' – 2010-06-29 20:37:03