在DEBUG模式下启用和禁用NSLog

Rod*_*igo 56 cocoa objective-c nslog

我想在调试时启用NSLog,否则禁用它.一个非常简单的事情是:

#ifdef DEBUG
NSLog(@"My log");
#endif
Run Code Online (Sandbox Code Playgroud)

但所有这一切#ifdef并且#endif是无聊的...... :(所以我尝试其他的东西:( .pch是放的好地方)

#ifdef DEBUG
#   define NSLog(text) NSLog(text);
#else 
#   define NSLog(text) 
#endif
Run Code Online (Sandbox Code Playgroud)

这项工作非常好(不是递归的).但问题是NSLog有无限的论据.

void NSLog(NSString *format, ...)
Run Code Online (Sandbox Code Playgroud)

我如何解决这个问题才能在预处理器模式下工作?

- 编辑 -

此代码使您的NSLog更好:

#ifdef DEBUG
    #define NSLog(FORMAT, ...) fprintf(stderr,"%s\n", [[NSString stringWithFormat:FORMAT, ##__VA_ARGS__] UTF8String]);
#else
    #define NSLog(...)
#endif
Run Code Online (Sandbox Code Playgroud)

Jus*_*Sid 105

这应该做的伎俩:

 #ifdef DEBUG
 #   define NSLog(...) NSLog(__VA_ARGS__)
 #else 
 #   define NSLog(...) (void)0
 #endif
Run Code Online (Sandbox Code Playgroud)

  • 该代码在哪里?在.pch文件中? (3认同)
  • @StianHøiland 虽然围绕 void 的三元运算符是否是一个好主意是值得怀疑的,但我已经更新了代码,以便它确实支持它。 (2认同)

Ara*_*yan 19

这有点短,并且在使用设备时也会禁用NSLog.如果您正在编写游戏,经常发送的NSLog可以将您的FPS从60降低到20.

#if !defined(DEBUG) || !(TARGET_IPHONE_SIMULATOR)
    #define NSLog(...)
#endif
Run Code Online (Sandbox Code Playgroud)


NaX*_*Xir 8

以上所有答案都是正确的.我建议你也可以用以下方式做.假设我有一个没有括号的if语句

if(x==5)
NSLog("x is 5");
Run Code Online (Sandbox Code Playgroud)

如果它将在没有声明的情况下替换NSLog会发生什么.所以我们可以简单地用空循环替换它.

#ifdef DEBUG
#define NSLog(...) NSLog(__VA_ARGS__)
#else
#define NSLog(...) do {} while (0)
#endif
Run Code Online (Sandbox Code Playgroud)

该语句将运行一次空循环.这将安全地从您的所有实时代码中删除您的NSLog.

  • 代码将被预处理为`if(x == 5);`这很好. (11认同)
  • 好点,这也是一个重复这个问题的好地方,首先使用带有括号的`if`语句可能是一个坏主意. (3认同)