NSLog是笔者在iOS开发中,用到的频率最高的函数,不是之一。比起下断点,然后一步一步的跟进调试程序,笔者更喜欢直观的通过NSLog输出一些东西以确定程序的运行行为。以前的时候有研究过怎样在打包提交时一次性清除所以的调试语句(调试总是件花时间的时候事儿,经常有时候写了一条输出,然后忘记注释了,然后可能要不知道哪天突然看到一条输出,然后要找半天才能注释掉),研究最终的结果还是觉得要养成好的习惯,用完的输出要及时注释。十一期间没事儿,突然又想到了这个话题,又研究了一番,发现不但可以一次性的取消所有的调试输出,还可以调整输出内容的格式!要知道原来通过NSLog输出的东西只有最后面冒号后面的东西是有用的。如:
2012-10-21 15:59:29.007 autoArchiveIPA[3718:303] Hello Yingkong1987
前面的时间,中间的应用名,进程号,再往后面这个不知道是嘛东东的东东,基本没啥用。于是改进了一下变成这样:
AppDelegate.m:18 Hello Yingkong1987
一下子输出信息就变得有用的多了,我们很容易的知道这条输出语句是AppDelegate.m这个文件的第18行。然后通过“Command+l”,调出“Jump”对话框,很容易快速定位到这条输出语句。
是不是有点儿期待是怎么实现的了呢?其实很简单,打开“工程名-Prefix.pch”文件,在里面的
#ifdef __OBJC__
#import <Cocoa/Cocoa.h>
#endif
#import <Cocoa/Cocoa.h>
#endif
后面添加:
/*
控制NSLog的输出
1 显示输出
0 不显示输出
*/
#if 1
#define NSLog(FORMAT, ...) fprintf(stderr,"%s:%d\t%s\n",[[[NSString stringWithUTF8String:__FILE__] lastPathComponent] UTF8String], __LINE__, [[NSString stringWithFormat:FORMAT, ##__VA_ARGS__] UTF8String]);
#else
#define NSLog(FORMAT, ...) nil
#endif
控制NSLog的输出
1 显示输出
0 不显示输出
*/
#if 1
#define NSLog(FORMAT, ...) fprintf(stderr,"%s:%d\t%s\n",[[[NSString stringWithUTF8String:__FILE__] lastPathComponent] UTF8String], __LINE__, [[NSString stringWithFormat:FORMAT, ##__VA_ARGS__] UTF8String]);
#else
#define NSLog(FORMAT, ...) nil
#endif
上面怎样控制调试信息的输出已经写的很清楚了,但是我还是觉得养成手动清除调试信息是个好习惯,你觉得呢?