在开发过程中,我们经常需要用到NSLog输出一些信息,甚至有的开发过程,必须在控制台查看输出,有经验的程序员通过控制台输出就能知道整个数据交互的一个流程.但是一个发布的程序,里面带有太多的NSLog输出,肯定对于App性能有所影响,这时候我们可以使用一个宏定义来处理,在开发的时候使用DEBUG模式,在发布的时候使用RELEASE模式.这样,发布的App就不会在程序内部做大量的NSLog输出了.   简单的代码如下:

#if defined (DEBUG)||defined(_DEBUG)   
 NSLog(@"测试代码");    
NSLog(@"Test Coding");
#endif
复制代码

上面的#if #endif宏定义的意思就是如果定义了DEBUG,那么就使用NSLog输出;否则这段代码就直接忽略不执行.有人会疑问这个DEBUG和_DEBUG来自哪里,这个其实不用担心,这个来自于Xcode的默认设置,我们可以取消DEBUG模式,开启RELEASE发布模式,如下面的截图所示.   选择Product->Scheme->Edit Scheme


App发布的时候,这些全部都要改成release模式 这些都选为release,就意味着默认没有定义Debug,则上面代码中#if...#endif之间的输出NSLog不会执行.这样在发布应用程序的时候,就节省了一些硬件设备的资源.

如何确定项目是处于Debug模式还是Release模式下? 首先确定一下项目的Build Settings是否已经设置过宏定义DEBUG,


如果已经设置过,在Preprocessor Macros的Debug后面会有DEBUG=1,如果没有,就手动设置一下. 接下来就可以这样做:

#ifdef DEBUG    
// do sth
#else   
// do sth
#endif
复制代码

也可以使用正则NSLog语句:

#ifndef DEBUG
#undef NSLog
#define NSLog(args,...)
#endif
复制代码

幸运的是,这里有一个最简单的办法进行log——通过一个宏,让NSLog只在debug build的时候起作用。将这个功能添加到全局都能访问得到的头文件中。这样你就可以尽情的使用log了,并且当进行production时,不会包含log相关代码。如下代码:

#ifdef DEBUG 
#defineDMLog(...)
NSLog(@"%s %@", __PRETTY_FUNCTION__,[NSString stringWithFormat:__VA_ARGS__])
#else# defineDMLog(...)do{}while(0)
复制代码

补充:如果上面的写法有点复杂 下面的写法就简单的多

//release屏蔽NSLog
//放在.pch文件里
#ifdef DEBUG
#else
#define NSLog(...) {};
#endif
复制代码

现在如果使用DMLog,那么将只会在debug build期间打印出log。而production build时则不会有任何log。通过__PRETTY_FUNCTION__ 可以打印出打印log所在的函数。

总结:虽然NSLog非常出色,但它也有一些限制: 只能在本地打印 不支持带级别的log(例如严重、警告等) NSLog效率低。在进行大量处理时,NSLog会严重影响程序的执行效率 互联网上也有一些框架可以进行日志记录,通过这些框架可以避免NSLog的一些限制。下面有两个不错的: Cocoa LumberJack – 这是针对Cocoa非常出名的一个日志框架。虽然刚开始用的时候会费劲点,但是它非常强大。 SNLog – NSLog的一个替代品。