在debugging模式下启用和禁用NSLog
我想在debugging时启用NSLog,否则禁用它。 一个非常简单的事情是:
#ifdef DEBUG NSLog(@"My log"); #endif
但是,所有这#ifdef
和#endif
是borring … :(所以我尝试其他的东西:( .pch是放好它的好地方)
#ifdef DEBUG # define NSLog(text) NSLog(text); #else # define NSLog(text) #endif
这项工作非常好(不recursion)。 但问题是,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
这应该做的伎俩:
#ifdef DEBUG # define NSLog(...) NSLog(__VA_ARGS__) #else # define NSLog(...) (void)0 #endif
这有点短,也使用设备时禁用NSLog。 如果你正在写游戏,经常发送的NSLogs可以将你的FPS从60降低到20。
#if !defined(DEBUG) || !(TARGET_IPHONE_SIMULATOR) #define NSLog(...) #endif
以上所有答案都是正确的。 我可以build议你以下面的方式做。 假设我有一个没有括号的if语句
if(x==5) NSLog("x is 5");
如果它将replaceNSLog没有声明会发生什么。 所以我们可以简单地用一个空循环replace它。
#ifdef DEBUG #define NSLog(...) NSLog(__VA_ARGS__) #else #define NSLog(...) do {} while (0) #endif
这个语句会运行一次空循环。 这将安全地从您的所有实时代码中删除您的NSLog。
#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设置为禁用。
这是一个很好的技巧…添加到任何.m
#define EXTRANSLog if([[NSUserDefaults standardUserDefaults] boolForKey:@"SomeFancyKey"] == YES) NSLog
replace任何
NSLog(@"????");
同
EXTRANSLog(@"????");
在这个例子中,我创build了NSUser键并将BOOL设置为YES,如果您不想通过控制台debugging器查看EXTRANSLog,则可以使用某种forms的开关等将键更改为NO或完全删除。
我在排除故障时使用此function,并且不希望出现所有过多的日志。 只有当SomeFancyKey == YES。
这是一样的
#define NSLog if(1) NSLog
其中1是YES显示NSLog,0是NO。