2011-08-24 74 views
0

我打算推廣調用NSLog,並避免在完成調試時註釋掉調用。推廣到NSLog的調用

我:

#define USE_ADLog 0 
#define USE_RPLog 0 
#define USE_DLLog 1 

void ConsoleADLog(NSString *message, ...); 
void ConsoleRPLog(NSString *message, ...); 
void ConsoleDLLog(NSString *message, ...); 

,例如:

void ConsoleADLog(NSString *message, ...) { 

#if (USE_ADLog) 
    va_list optionalArgs; 

    va_start(optionalArgs, message); // after the parm = message 
    va_end(optionalArgs); 

    NSLog(message, optionalArgs); 
#endif 
} 

到目前爲止,一切都很好......但是,當我打電話,例如,:

ConsoleDLLog(@"parm1 = %@, parm2 = %@", parm1, parm2); 

哪個調用是在一個輔助線程中,我是炸彈。我想?? va_start,va_end是線程安全的。

...或者是問題%@ ...我知道%f作品???

顯然不是!,因此如何使他們線程安全的......平原OLE

NSLog(@"whatever %@", whateverParm) 

作品,但上面沒有的功能。

感謝,

+0

檢查此主題: http://stackoverflow.com/questions/969130/nslog-tips-and-tricks –

+0

我不明白的幾件事。爲什麼在使用前在va_end中釋放optionalArgs?不應該用'msg = [[[NSString alloc] initWithFormat:消息參數:optionalArgs] autorelease]來保存它。 va_end(optionalArgs);'然後NSLog的味精?你真的想要NSLog的ASL?你可以使用fprintf來代替。 – Jano

回答

0
#if DEBUG == 0 
#define DebugLog(...) 
#elif DEBUG == 1 
#define DebugLog(...) NSLog(__VA_ARGS__) 
#endif 

使用DebugLog(@"Uh oh: %@", someArgument);然後調用它。如果DEBUG設置爲1,則預處理器將發出NSLog(@"Uh oh: %@", someArgument);。如果它設置爲0,它不會發射任何東西。

+0

原諒我,因爲我只是不記得具體細節......但是,在Xcode 4(不是3)中,#define DebugLog(...)和一個空的等價物產生了某種(外部)警告。該死,我希望我能記得! –

1

這就是爲什麼許多可變參數的功能包括接受va_list小號變種。

看到NSLogv

+0

阿門...使用NSLogv(@「whatever%@,whateverParm)並且都變好了......但是,由於NSLog只是調用NSLogv,爲什麼不在這裏使用NSLog工作,我知道」我們不是在說爲什麼等等......「但是爲什麼? –

+0

在這裏接受的答案見QA:http://stackoverflow.com/questions/3143906/how-to-use-va-args-to-pass-arguments-on- variadic-parameters-elipsis – justin

+0

謝謝,賈斯汀......爲什麼?來自Yuji「你不能。一旦...被轉換爲va_list,它只能被傳遞給一個函數或一個接受va_list的方法,而不是一個接受可變數量參數的函數/方法。「 –