雨雪霏霏 – iPhone博客

22 Jun, 2010

NSLog:既是天使也是魔鬼

Posted by: 雨雪霏霏 In: iPhone

相信所有的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了!

3 Responses to "NSLog:既是天使也是魔鬼"

1 | Jiang

June 23rd, 2010 at 9:02 am

Avatar

windows的vc开发中:
#ifdef _DEBUG
OutputDebugString(“”)
#endif

应该是这样

2 | 雨雪霏霏

June 24th, 2010 at 3:01 pm

Avatar

呵呵,赞windows版。不过感觉用vc写windows程序不如用qt写,代码不用改,编译一下,mac、linux版都有了。

3 | eingbol

August 8th, 2010 at 10:38 am

Avatar

qt是比较赞。虽然工作中绝大数是用mfc

Comment Form

About

About Google, about Apple, about phones and browsers, about science and technologies.

Subscribe