2010-06-29 10 views
9

Nie mogę zrozumieć mojej składni wielu argumentów w Objective-C. Widziałem this question, ale odpowiedź nie pomogła mi (jeszcze).Jak używać va_args do przekazywania argumentów (parametry variadic, ellipsis)

Tu jest mój kodu (właściwie będę chciał, aby w końcu przejść do NSString stringWithFormat, ale coraz NSLog pracować będzie na tyle dobry na razie):

- (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); 
} 

argument (lub jakiś argument) przechodzi przez , ale ma pewną dziwną wartość (wyjście to blah blah 1606412704). Jak przekazać wartości, które przychodzą przez ...?

+0

Związany z, ale nie do końca duplikatem: http://stackoverflow.com/questions/2345196 –

Odpowiedz

20

Jest to wariant NSLog że akceptuje va_list nazywa NSLogv:

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

Jedynym sposobem przekazania faktycznej ... (nie va_list) jest użyj makra. Na przykład:

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

to jednak powinny być stosowane bardzo oszczędnie, ponieważ makra mogą uczynić kod naprawdę zaciemniony.

+0

To jest fajne i +1, ale wciąż nie wiem jak przekazać args do następnej metody (a może robię to dobrze?) –

+3

Nie możesz. Gdy '...' jest konwertowane na 'va_list', może być przekazane tylko do funkcji lub metody, która akceptuje' va_list', a nie do funkcji/metody, która akceptuje zmienną liczbę parametrów. – Yuji

+0

@Yuji, ooooooooooooooooo lemme wypróbuj to. –

12

Można użyć -[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

Wow. Chociaż to nie odpowiada na moje pytanie, rozwiązuje mój obecny problem. Jak jednak przesłać argumenty do następnej metody? –

+0

Nie można przekazać zmiennych parametrów. Możesz przekazać 'args', ale oznacza to, że funkcja lub metoda musi przyjąć obiekt typu' va_list'. – mipadi

+1

Okay, to bardzo fajne. Skończyło się na tym tekście "- (void) log: (NSString *), ...;" i "- (void) log: (NSString *) zArguments: (va_list) list;' –

Powiązane problemy