2010-03-06 171 views
37

我已經google了一下,才知道如何使用可變參數。但我想將我的可變參數傳遞給另一個方法。我會得到錯誤。怎麼做 ?如何將可變參數傳遞給另一個方法?

-(void) aMethod:(NSString *) a, ... { 
    [self anotherMethod:a]; 
    // i m doing this but getting error. how to pass complete vararg to anotherMethod 
} 

回答

49

AFAIK ObjectiveC(就像C和C++一樣)不會爲您提供一種語法,允許您直接記住。

通常的解決方法是創建函數的兩個版本。一個可以直接使用...而另一個被其他人調用的函數以va_list的形式傳遞參數。

 
.. 
[obj aMethod:@"test this %d parameter", 1337); 
[obj anotherMethod:@"test that %d parameter", 666); 
.. 

-(void) aMethod:(NSString *)a, ... 
{ 
    va_list ap; 
    va_start(ap, a); 

    [self anotherMethod:a withParameters:ap]; 

    va_end(ap); 
} 

-(void) anotherMethod:(NSString *)a, ... 
{ 
    va_list ap; 
    va_start(ap, a); 

    [self anotherMethod:a withParameters:ap]; 

    va_end(ap); 
} 

-(void) anotherMethod:(NSString *)a withParameters:(va_list)valist 
{ 
    NSLog([[[NSString alloc] initWithFormat:a arguments:valist] autorelease]); 
} 
+1

-anotherMethod中有一個內存精益:withParameters:你需要添加一個autorelease到[[NSString alloc] init] – 2010-09-10 20:48:39

+0

true和correct @Bill – Till 2010-09-14 04:23:41

+0

非常好!我想將一個可變參數列表傳遞給predicateWithFormat:在你提出這個建議之後,我意識到Apple事實上已經提供了一個predicateWithFormat:參數:相當於我之前沒有注意到的。 – ArtOfWarfare 2013-06-30 19:05:08

20

您不能直接傳遞可變參數。但是其中一些方法提供了一種替代方案,您可以通過va_list參數,例如

#include <stdarg.h> 

-(void)printFormat:(NSString*)format, ... { 
    // Won't work: 
    // NSString* str = [NSString stringWithFormat:format]; 

    va_list vl; 
    va_start(vl, format); 
    NSString* str = [[[NSString alloc] initWithFormat:format arguments:vl] autorelease]; 
    va_end(vl); 

    printf("%s", [str UTF8String]); 
} 
1

您是否考慮過在數組或字典中設置參數,並進行條件編碼?

-(void) aMethodWithArguments:(NSArray *)arguments { 
    for (id *object in arguments) { 
     if ([object isKindOfClass:fooClass]) { 
      //handler for objects that are foo 
      [self anotherMethod:object]; 
     } 
     if ([object isKindOfClass:barClass]) { 
      //and so on... 
      [self yetAnotherMethod:object]; 
     } 
    } 
} 
0

我認爲你可以使用宏來實現同樣的事情。 比方說,你想傳遞amethod方法的可變參數到另一個

-(void) aMethod:(NSString *) a, ... { 
} 

你可以定義你的另一種「方法」使用宏,雖然它不是一個真正的方法:

#define anotherMethod(_a_,...) [self aMethod:_a_,##__VA_ARGS__] 

這是我的解決方案。

相關問題