文档章节

Objective-c NSLog 的宏定义

Daniel_s
 Daniel_s
发布于 2015/12/26 15:58
字数 687
阅读 75
收藏 0

__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 


本文转载自:

Daniel_s
粉丝 13
博文 156
码字总数 4133
作品 0
十堰
程序员
私信 提问
IOS应用发布NSLog的注释及使用重定向,把控制台内容写入文件

1 选择工程的Target -> Build Settings -> Preprocessor Macros. 如图,默认 Debug项,是“DEBUG=1”. 2 在程序中设置全局宏定义 在程序的 ApplicationName-Prefix.pch 文件中,加入如下,很...

mahb520
2012/11/19
0
0
ios define NSLog debug 应用发布nslog注释

1 选择工程的Target -> Build Settings -> Preprocessor Macros. 如图,默认 Debug项,是“DEBUG=1”. 2 在程序中设置全局宏定义 在程序的 ApplicationName-Prefix.pch 文件中,加入如下,很...

孙启超
2014/01/12
0
1
Objective C学习笔记

1、代码文件类型: (1)、[.h]头文件 (2)、[.m]c代码 (3)、[.mm]c++代码 2、调用头文件的方法#import,且只在没有调用过的时候调用一次,类似于PHP的require_once。 3、字符串NSString 通过@...

xiejuntao
2014/10/02
0
0
javascript与Objective-C的交互

在iOS开发中, 苹果api味我们提供了多种javascript和Objective-C交互的方法, 使用还是比较简单的. 1. 普通的方式实现javascript和Objective-C交互 1.1 oc原生代码调用js代码 通过webView的str...

hell03W
2016/05/04
169
0
iOS深入学习:#define

ios#define 我建了一个iOS开发QQ交流群:714042473,大家可以一起来相互学习。 一般情况下,我们使用#define来定义一个常量,#define的本质是文本替换,例如#define INTPTR int*,这时候我们...

iOS洛柒
2018/07/12
0
0

没有更多内容

加载失败,请刷新页面

加载更多

MySql双主架构原理

在企业中,一般系统架构的瓶颈会出现在数据库这一部分,mysql主从架构在很大程度上解决了这部分瓶颈,但是在mysql主从同步的架构也存在很多问题;比如:1.关于数据写入部分(也就是主库)往往很难做...

xiaomin0322
12分钟前
0
0
分布式系统中一致性哈希

问题场景 近年来B2C、O2O等商业概念的提出和移动端的发展,使得分布式系统流行了起来。分布式系统相对于单系统,解决了流量大、系统高可用和高容错等问题。功能强大也意味着实现起来需要更多...

Java领航员
14分钟前
0
0
接口限流算法:漏桶算法和令牌桶算法

漏桶算法 漏桶可以看作是一个带有常量服务时间的单服务器队列,如果漏桶(包缓存)溢出,那么数据包会被丢弃。这一点和线程池原理是很相似的。 把请求比作是水,水来了都先放进桶里,并以限定...

铁骨铮铮
21分钟前
1
0
Android 生成二维码工具类

/** * 生成条形码和二维码的工具 */public class ZXingUtils { /** * 生成二维码 要转换的地址或字符串,可以是中文 * * @param url * @param width ...

lanyu96
26分钟前
1
0
谈谈lucene的DocValues特性之SortedNumericDocValuesField

前面已经介绍过NumericDocValuesField,这里想强调一下SortedNumericDocValuesField是针对同一篇文档中一键多值的情况进行排序的,换句话说不同文档的同一字段值可以乱序。核心的写入流程与谈...

FAT_mt
34分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部