Objective-c NSLog 的宏定义

来源:互联网 发布:穿裙子骑自行车 知乎 编辑:程序博客网 时间:2024/06/05 16:54


__VA_ARGS__ 是一个可变参数的宏,这个可变参数的宏是新的C99规范中新增的,目前似乎只有gcc支持(VC6.0的编译器不支持)。宏前面加上##的作用在于,当可变参数的个数为0时,这里的##起到把前面多余的","去掉,否则会编译出错。
2) __FILE__ 宏在预编译时会替换成当前的源文件名
3) __LINE__宏在预编译时会替换成当前的行号
4) __FUNCTION__宏在预编译时会替换成当前的函数名称

Objective-c NSLog 的宏定义

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


当然还有其他的方式,比如:

1.直接自己写#define,当release版本的时候把#define 注释掉即可
1. #define IOS_DEBUG
2. #ifdef IOS_DEBUG  
3. #define NSLog(...) NSLog(__VA_ARGS__)  
4. #endif 
 
2.
1. #ifdef DEBUG    
2. # define DLog(format, ...) NSLog((@"[文件名:%s]" "[函数名:%s]" "[行号:%d]" format), __FILE__, __FUNCTION__, __LINE__, ##__VA_ARGS__);    
3. #else    
4. # define DLog(...);    
5. #endif 


0 0
原创粉丝点击