我的上一篇关于条件日志的文章收到了相当一部分的回复,部分人指出#ifdef DEBUG语句影响美观而且容易出错,Karl Kraft就说到创建一个新的DebugLog类来替代NSLog。
至今NSLog出来很长一段时间了,现在有很多这个问题的解决方案。
CocoaDev建议用这些宏:
#if MY_DEBUG_FLAG
#define DEBUG_OUTPUT( a ) NSLog( a )
#define DEBUG_OUTPUT1( a, b ) NSLog( a, b )
#else
#define DEBUG_OUTPUT( a ) // (a)
#define DEBUG_OUTPUT1( a, b ) // (a,b)
#endif
列出所有 参数数量 不同的变体宏似乎有点乏味,所以通过
#define DEBUG_OUTPUT(fmt, ...) NSLog(fmt, ## __VA_ARGS__)
就如
Fraser Hess在Dropping NSLog in release builds里面所描述的,你可以将它放在你的<应用名>_Prefix.pch 文件中;
#ifdef DEBUG
# define DLog(...) NSLog(__VA_ARGS__)
#else
# define DLog(...) /* */
#endif
#define ALog(...) NSLog(__VA_ARGS__)
在使用ALog的情况下,无论DEBUG标记的状态是什么,日志总是会在你想要的地方打印,我比较偏好这种预处理宏的方法,因为你不用在你的整个工程随时随地导入额外的类,只需在你工程的一个文件粘贴几行代码就可以了。
但是我觉得还可以再将它改进一下。
内置的宏__PRETTY_FUNCTION__还是相当不错的,它会输出当前的类名和方法名。
Mark Damon Huges在他的Cocoa logging宏中就使用了它:
#ifdef DEBUG
// DLOG takes a format argument (which must begin %s) and 0 or more args:
// DLOG(@"%s");
// DLOG(@"%s: %d", x);
#define DLOG(fmt, ...) NSLog(fmt, __PRETTY_FUNCTION__, ##__VA_ARGS__)
#else
#define DLOG(...)
#endif
这个宏有一个缺点就是,它需要 在你所有的日志语句中添加一个"%s",例如DLog(@"%s foo");而不是NSLog(@“foo”);所以它并不是NSLog替代。
那我们来修改一下。
#define DLog(fmt, ...) NSLog((@"%s " fmt), __PRETTY_FUNCTION__, ##__VA_ARGS__);
现在你可以使用DLog
(@”foo”);以及像DLog(@”value: %d”, x)这样传值。
最后一步就是添加行号了。
#define DLog(fmt, ...) NSLog((@"%s [Line %d] " fmt), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__);
现在如果嫌麻烦的你,想知道具体执行到特定到一行,只需使用DLog就行了。
好了,现在列出这个宏的完整内容:
// DLog is almost a drop-in replacement for NSLog
// DLog();
// DLog(@"here");
// DLog(@"value: %d", x);
// Unfortunately this doesn't work DLog(aStringVariable); you have to do this instead DLog(@"%@", aStringVariable);
#ifdef DEBUG
# define DLog(fmt, ...) NSLog((@"%s [Line %d] " fmt), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__);
#else
# define DLog(...)
#endif
// ALog always displays output regardless of the DEBUG setting
#define ALog(fmt, ...) NSLog((@"%s [Line %d] " fmt), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__);
像前面讲的那样设置好DEBUG变量。(译者:Xcode5参见:http://blog.csdn.net/assholeu/article/details/32831981)
我相信这还可以再改进,集思广益。
转载请注明出处(http://blog.csdn.net/assholeu/article/details/32796537)