2013-04-23 126 views
2

我沒有關於目標c變量參數函數的清晰想法。我想寫一個函數,它將採用一個nlsog類型的參數,但有時我會在該函數中使用NSLog。我怎樣才能做到這一點?NSLog裏面的變量參數函數

-(void) printStatus:(NSString*)status, ... 
{ 
    // I want use use NSLog with all these parameter here. 

    // some gui logging also happens here 
} 

電話會是這樣,

[self printStatus:@"status"]; 

[self printStatus:@"Staus: %@", someObject]; 

而不是使用的NSLog的,我想用printStatus。當我需要將控制檯日誌記錄切換到GUI日誌記錄時,我只能更改爲printStatus函數,而不更改代碼中的所有位置。

或者像我現在用在這裏使用DLOG,

#ifdef DEBUG 
# define DLog(fmt, ...) NSLog((@"%s [Line %d] " fmt), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__) 
#else 
# define DLog(...) /* */ 
#endif 

回答

6

你需要使用C的工作可變參數的類型和NSLogv宏:

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

這是假設status參數是一個格式字符串,然後它的參數。

如果你想創建一個從格式字符串和參數的NSString(用於更新GUI)除了可以做到這NSLogv

NSLogv(status, args); 
NSString *message = [[NSString alloc] initWithFormat:status arguments:args]; 
// ... log to GUI 
+0

謝謝。但我使用的是一個DLog宏,我在那裏使用NSLog。有什麼辦法可以使用NSLog? #ifdef DEBUG #define DLog(fmt,...)NSLog((@「%s [Line%d]」fmt),__PRETTY_FUNCTION__,__LINE__,## __ VA_ARGS__) #else #define DLog(...)/* */ #endif – karim 2013-04-23 10:06:00

+1

傳遞函數/方法中變量參數的唯一方法是使用'va_list'。這就是爲什麼大多數圖書館都會提供一個接受'va_list'的'* v'選項。因此,您應該創建一個調用「NSLogv」的'DLogv',並將參數轉發給它。 – 2013-04-23 10:07:24

+0

謝謝。我在想第二個案子。但我不確定第一例。由於在第二種情況下創建字符串時,我必須調用va_start(args,status),否則args不會與NSString一起使用。不是? – karim 2013-04-23 10:12:20

-2

我不能夠準確地理解這個問題。我的理解,你可以使用格式化字符串

[NSString stringWithFormat:@"this is string %@",@"String"]; 
+0

而不是使用NSLog,我想使用printStatus。當我需要將控制檯日誌記錄切換到GUI日誌記錄時,我只能更改爲printStatus函數,而不更改代碼中的所有位置。 – karim 2013-04-23 10:00:59

1

最後,對於有興趣的人,這是我的最終版本日誌...

-(void) printStatus:(NSString*)status, ... 
{ 
    va_list args; 
    va_start(args, status); 
    va_end(args); 
    NSString * str = [[NSString alloc] initWithFormat:status arguments:args]; 
    DLog(@"%@", str); 
    self.statusTextView.text = [_statusTextView.text stringByAppendingFormat:@"\n%@",str]; 
    [str release]; 
} 

DLogPrefix.pch文件中定義,

#ifdef DEBUG 
# define DLog(fmt, ...) NSLog((@"%s [Line %d] " fmt), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__) 
#else 
# define DLog(...) /* */ 
#endif 
+0

「//在主線程上調用此方法」而不是「這不起作用。您正在失去所有可變參數參數,並且該函數將在主線程上崩潰,如果它期望任何這些參數 – newacct 2013-04-23 19:45:19

+0

謝謝。我修改了代碼。但是我也需要讓它更友好。 – karim 2013-04-24 09:41:37