2012-09-28 65 views
0

我提到this SO Answer爲目標創建可變參數函數C. 創建可變參數的功能我通過傳遞參數,像下面的測試代碼:iPhone在Objective C的問題

[self logMessage:@"string: %@\n number: %@\n image: %@", 
@"asdf", 
[NSNumber numberWithInt:23], 
[UIImage imageNamed:@"local.png"]]; 

,並與編輯的NSLog代碼();

- (void)logMessage:(NSString *)format, ... { 

    va_list args; 
    va_start(args, format); 

    id arg = nil; 
    int i = 1; 
    NSLogv(format, args); 
    while ((arg = va_arg(args,NSString *))) { 

     NSLog(@"val: %d", i++); 
     /// Do your thing with arg here 
     //NSString *name = NSStringFromClass([arg class]); 
     //NSLog(@"string: %@", name); 
    }   
    va_end(args); 
} 

但產量如下:

2012-09-28 19:34:45.271 SIMO[2384:c07] string: asdf 
number: 23 
image: <UIImage: 0x8151f80> 
2012-09-28 19:34:45.273 SIMO[2384:c07] val: 1 
2012-09-28 19:34:45.273 SIMO[2384:c07] val: 2 
2012-09-28 19:34:45.274 SIMO[2384:c07] val: 3 
2012-09-28 19:34:45.274 SIMO[2384:c07] val: 4 
2012-09-28 19:34:45.274 SIMO[2384:c07] val: 5 
2012-09-28 19:34:45.275 SIMO[2384:c07] val: 6 
2012-09-28 19:34:45.275 SIMO[2384:c07] val: 7 
2012-09-28 19:34:45.276 SIMO[2384:c07] val: 8 

這告訴說法是8,但我通過只有3個(的NSString,NSNumber的,UIImage的) 我不能讓這個概念..你能否澄清我 任何人都可以澄清這一點

回答

2

va_arg並不真正知道參數列表何時結束。您使用的方法期望參數列表被終止nil,如+[NSArray arrayWithObjects:]

因此,要麼改變你的調用,在參數列表的末尾添加nil,要麼找到一些其他方式來知道參數何時結束(例如,對於printf克隆,您可能知道格式參數的數量字符串本身)。

+0

正常工作,因爲我預計謝謝.... –