避免代码中的调试内容混乱

Kal*_*lle 6 iphone debugging coding-style objective-c code-cleanup

当我写东西时,一半的努力倾向于添加清晰简洁的调试输出,或者当需要调试时可以启用/禁用的功能.

调试功能的一个例子是下载器类,在这里我可以打开一个#define,让它"假装"下载文件,然后简单地把我送回去.这样我就可以测试用户下载文件时会发生什么,而不必等待网络每次都物理地抓取文件.这是很棒的功能,但#ifdefs的代码变得更加混乱.

我最终得到了一堆#define

// #define DEBUG_FOOMODULE_FOO
// #define DEBUG_BARMODULE_THINGAMAJIG
// ...
Run Code Online (Sandbox Code Playgroud)

对于我想看的东西没有注释.代码本身就像是

- (void)something
{
    #ifdef DEBUG_FOOMODULE_FOO
    DebugLog(@"something [x = %@]", x);
    #endif
    // ...
    #ifdef DEBUG_FOOMODULE_MOO
    // etc
}
Run Code Online (Sandbox Code Playgroud)

这对于编写/维护代码非常有用,但它对代码的外观没有任何作用.

人们如何编写毫不费力的即时长期调试"东西"呢?

注意:我不仅在这里谈论NSLogging ......我也在讨论像上面假装下载这样的东西.

Jan*_*ano 2

在编写自己的库之前,我阅读了几个库,并看到了两种方法:宏 + C 函数 ( NSLogger ) 或宏 + Singleton ( GTMLoggerCocoa Lumberjack )。

我在这里使用宏+单例编写了我的幼稚实现。我在运行时执行此操作:

[Logger singleton].logThreshold = kDebug;
trace(@"hi %@",@"world); // won't show
debug(@"hi %@",@"world);
Run Code Online (Sandbox Code Playgroud)

您可以对包而不是日志级别执行相同的操作。如果我想让它消失,我会更改#defines。这是涉及的代码:

#define trace(args...) [[Logger singleton] debugWithLevel:kTrace line:__LINE__ funcName:__PRETTY_FUNCTION__ message:args];

if (level>=logThreshold){
  // ...
} 
Run Code Online (Sandbox Code Playgroud)

如果您想要对 Lumberjack 进行更复杂的了解,它有一个注册类工具可以切换某些类的日志记录。