2010-10-01 97 views
9

我正在開發一個靜態庫,它將分發給其他可能需要調試語句的開發人員。所以我有幾個級別的日誌記錄。如何從格式和va_list獲取格式化的NSString?

爲了避免的

if(loggingLevelCurrentlySet >= loggingLevelWantedForThisInstance){ 
    NSLog(@"log this"); 
} 

恆定外觀我創建了一組記錄功能包裝紙。一個簡化的版本是這樣的:

void myLog(int logLevel, NSString *format, va_list args){ 
    if((loggingLevelCurrentlySet >= logLevel)){ 
     NSLogv(format, args); 
    } 
} 

void myLogLevel1(NSString *format, ...){ 
    va_list args; 
    va_start(args, format); 

    myLog(1, format, args); 
    va_end(args); 
} 

void myLogLevel2(NSString *format, ...){ 
    va_list args; 
    va_start(args, format); 

    myLog(2, format, args); 
    va_end(args); 
} 

但現在,我想,從內部myLog,獲得了完全格式化字符串做別的事情用。

void myLog(int logLevel, NSString *format, va_list args){ 
     NSString *fullString = [NSString stringWithFormat:format, args]; //crashes when args is anything but an empty list 
     CFStringRef cfsr = CFStringCreateWithFormat(kCFAllocatorDefault, NULL, format, args); //also crashes 

     //want to use the string here 

     if((loggingLevelCurrentlySet >= logLevel)){ 
      NSLogv(format, args); 
     } 
} 

回答

13
NSString *fullString = [[[NSString alloc] initWithFormat:format arguments:args] autorelease]; 

沒有爲一個方法)

雖然我建議不要使用的功能,但一些簡單的宏定義:

#define myLogLevel1(format, ...) myLog(1, format, __VA_ARGS__) 
#define myLogLevel2(format, ...) myLog(2, format, __VA_ARGS__) 
+0

感謝。快捷類方法不起作用的原因是什麼? – executor21 2010-10-01 23:26:08

+0

在(Objective-)C中,可以在這樣一個'va_list'中捕獲一個可變長度的參數列表,但是在調用另一個對象時永遠不會再使用它。它根本行不通,非常煩人。通過使用宏雖然,預處理器將正確處理它,它會編譯,就像你只是鍵入'myLog(1,format,arg1,arg2,arg3);'這樣就可以工作。它更快,因爲在運行時沒有額外的代碼要執行。 – Joost 2010-10-01 23:34:27