我想统一调用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有效吗???
显然不是!所以如何让它们保持线程安全......简单
NSLog(@"whatever %@", whateverParm)
有效,但不是上述功能。
谢谢,
答案 0 :(得分:1)
这就是为什么许多可变函数包括接受va_list
s。
请参阅NSLogv
。
答案 1 :(得分: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
,则不会发出任何内容。