在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。