在DEBUG模式下启用和禁用NSLog

时间:2011-07-01 19:02:30

标签: objective-c cocoa nslog

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

#ifdef DEBUG
NSLog(@"My log");
#endif

但是所有这些#ifdef#endif都是...... {(所以我尝试了其他的事情:( .pch是放置它的好地方)

#ifdef DEBUG
#   define NSLog(text) NSLog(text);
#else 
#   define NSLog(text) 
#endif

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

void NSLog(NSString *format, ...)

如何在预处理器模式下解决此问题?

- 编辑 -

此代码使您的NSLog更好:

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

5 个答案:

答案 0 :(得分:104)

这应该可以解决问题:

 #ifdef DEBUG
 #   define NSLog(...) NSLog(__VA_ARGS__)
 #else 
 #   define NSLog(...) (void)0
 #endif

答案 1 :(得分:19)

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

#if !defined(DEBUG) || !(TARGET_IPHONE_SIMULATOR)
    #define NSLog(...)
#endif

答案 2 :(得分:8)

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

if(x==5)
NSLog("x is 5");

如果它将替换没有语句的NSLog会发生什么。所以我们可以简单地用空循环替换它。

#ifdef DEBUG
#define NSLog(...) NSLog(__VA_ARGS__)
#else
#define NSLog(...) do {} while (0)
#endif

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

答案 3 :(得分:1)

#ifndef Debug
    #define Debug 1
#endif

#if Debug
#   define DebugLog(fmt, ...) NSLog((@"%s [Line %d] " fmt), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__);
#else
#   define DebugLog(...)
#endif

将Debug设置为1以启用日志,将0设置为禁用日志。

答案 4 :(得分:1)

这是一个很好的伎俩...... 添加到任何.m

#define EXTRANSLog if([[NSUserDefaults standardUserDefaults] boolForKey:@"SomeFancyKey"] == YES) NSLog 

替换任何

NSLog(@"????");

EXTRANSLog(@"????");

在这个例子中,我创建了一个NSUser密钥,并将BOOL设置为YES,使用某种形式的开关等将密钥更改为NO或者如果您不想查看EXTRANSLog'则将其删除。 s通过控制台调试器。

我在进行故障排除时使用此功能,并且不希望显示所有过多的日志。 仅当SomeFancyKey == YES时。

这与

相同
#define NSLog if(1) NSLog

其中1为YES表示NSLog,0表示NO。