我想在调试时启用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
答案 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。