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 ......我也在讨论像上面假装下载这样的东西.
在编写自己的库之前,我阅读了几个库,并看到了两种方法:宏 + C 函数 ( NSLogger ) 或宏 + Singleton ( GTMLogger、Cocoa 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 进行更复杂的了解,它有一个注册类工具可以切换某些类的日志记录。