__VA_ARGS__ 是一个可变参数的宏,这个可变参数的宏是新的C99规范中新增的,目前彷佛只有gcc支持(VC6.0的编译器不支持)。宏前面加上##的做用在于,当可变参数的个数为0时,这里的##起到把前面多余的","去掉,不然会编译出错。 2) __FILE__ 宏在预编译时会替换成当前的源文件名 3) __LINE__宏在预编译时会替换成当前的行号 4) __FUNCTION__宏在预编译时会替换成当前的函数名称函数
Objective-c NSLog 的宏定义spa
相信全部的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了!
debug
固然还有其余的方式,好比:调试
1.直接本身写#define,当release版本的时候把#define 注释掉便可
1. #define IOS_DEBUG
2. #ifdef IOS_DEBUG
3. #define NSLog(...) NSLog(__VA_ARGS__)
4. #endif orm
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 游戏