概括对NSLog的调用

时间:2011-08-24 20:55:03

标签: iphone objective-c cocoa macos 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有效吗???

显然不是!所以如何让它们保持线程安全......简单

NSLog(@"whatever %@", whateverParm)

有效,但不是上述功能。

谢谢,

2 个答案:

答案 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,则不会发出任何内容。