当我写东西时,一半的努力倾向于添加清晰简洁的调试输出,或者在需要调试时可以启用/禁用的功能。
调试功能 的一个示例是下载器类,我可以在其中打开#define,使其“假装”下载文件并简单地把我已经拥有的文件还给我。这样我就可以测试看看当用户下载文件时会发生什么,而不必每次都等待网络物理抓取文件。这是一个很棒的功能,但代码因 #ifdefs 而变得更加困惑。
我最终得到了一堆 #define
之类的
// #define DEBUG_FOOMODULE_FOO
// #define DEBUG_BARMODULE_THINGAMAJIG
// ...
我想看的东西没有注释。代码本身类似于
- (void)something
{
#ifdef DEBUG_FOOMODULE_FOO
DebugLog(@"something [x = %@]", x);
#endif
// ...
#ifdef DEBUG_FOOMODULE_MOO
// etc
}
这对编写/维护代码很有用,但对代码的外观没有任何作用。
无论如何,人们如何编写毫不费力的实时调试“东西”?
注意:我不仅在这里谈论 NSLogging...我还在谈论类似上面的假装下载的东西。
最佳答案
在编写自己的库之前,我阅读了几个库并看到了两种方法:宏 + C 函数 ( NSLogger ) 或宏 + 单例 ( GTMLogger , Cocoa Lumberjack )。
我写了我天真的实现 here使用宏+单例。我在运行时这样做:
[Logger singleton].logThreshold = kDebug;
trace(@"hi %@",@"world); // won't show
debug(@"hi %@",@"world);
您可以对包而不是日志级别执行相同的操作。如果我想让它消失,我会更改#defines。这是涉及的代码:
#define trace(args...) [[Logger singleton] debugWithLevel:kTrace line:__LINE__ funcName:__PRETTY_FUNCTION__ message:args];
if (level>=logThreshold){
// ...
}
如果您想更深入地了解 Lumberjack,它有一个注册类工具来切换某些类的日志记录。
关于iphone - 避免代码中的调试内容困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6761603/