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