现在的位置: 首页 > 综合 > 正文

NSLog—程序中的双刃剑

2014年02月24日 ⁄ 综合 ⁄ 共 773字 ⁄ 字号 评论关闭

相信所有的iPhone开发者都曾经或者将会用到NSLog这个函数。NSLog的强大之处在于,它能在代码运行过程中显示变量值以及程序实际走向,能帮助我们发现大量错误和潜在风险。我们希望尽可能多的用到NSLog,希望它能无处不在,使得错误无法存在——简单的说NSLog是一个天使。

比如下面这段代码就利用NSLog,在程序运行时判断设备种类并显示出来

NSString *deviceType = [UIDevice currentDevice].model;
NSLog(@”device type: %@.”, deviceType);



使用NSLog的一个风险是:它的运行会占用时间和设备资源。当我们用Simulator时,NSLog的资源占用并不引人注意,风险也不会显示出来。但是如果你写的是一个即时战略游戏,而你在每一个action中都加入了NSLog——那么NSLog将成为一个魔鬼。灾难的具体表现常常是:你在Simulator中运行游戏畅通无阻,但到了真机上,会发现很“卡”,不论是拖动一个单位还是缩放一个场景,FPS也降到了各位数。

简单而粗暴的解决方案是:在一个游戏release前,将所有的NSLog注释掉。简单有效,但副作用是:下次你要调试时,又得将NSLog一个个取消注释。

我找到了一个最为有效的解决方案:你以release模式编译的程序不会用NSLog输出,而你以debug模式编译的程序将执行NSLog的全部功能。

#ifndef __OPTIMIZE__

# define NSLog(…) NSLog(__VA_ARGS__)

#else

# define NSLog(…) {}

#endif


代码来源

这个代码的魔术在于:release模式通常会定义 __OPTIMIZE__,当然debug模式不会。将这段代码放在你的头文件当中,你就可以放心的使用NSLog了!

抱歉!评论已关闭.