美文网首页
iOS中 项目中的NSLog的处理

iOS中 项目中的NSLog的处理

作者: _TT_ | 来源:发表于2017-11-17 08:49 被阅读0次

在iOS开发过程中,我们经常要用到NSLog来打印一些调试信息,而且一般是习惯性的大量使用,在模拟器上运行可能没有感觉到什么,但是在真机上,NSLog的输出还是比较消耗系统资源的,而且输出的数据有时也可能会暴露出App中的某些数据,所以发布正式版时需要把这些输出全部屏蔽掉。


我们可以在发release包之前将这些NSLog统统注释掉,但是如果是大量使用,就有些太过麻烦,而且下次开发时,又需要将注释分别打开继续使用,这样做着实无趣。下面列举两种方式解决:

1.通过DEBUG条件编译全局控制

因为是全局控制,首先创建pch文件,具体方法较为简单,不过在Xcode6之后注意绑定pch文件的相对路径,

设置pch戳这里,创建好之后,在pch文件中添加下列代码:

#ifdef DEBUG

#define AllLog(fmt, ...) NSLog((@"[文件名:%s]\n" "[函数名:%s]\n" "[行号:%d] \n" fmt), __FILE__, __FUNCTION__, __LINE__, ##__VA_ARGS__);

#define DeBugLog(fmt, ...) NSLog((@"%s [Line %d] " fmt), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__);

#define NSLog(...) NSLog(__VA_ARGS__);

#define MyNSLog(FORMAT, ...) fprintf(stderr,"[%s]:[line %d行] %s\n",[[[NSString stringWithUTF8String:__FILE__] lastPathComponent] UTF8String], __LINE__, [[NSString stringWithFormat:FORMAT, ##__VA_ARGS__] UTF8String]);

#else

#define AllLog(...)

#define DeBugLog(...)

#define NSLog(...)

#define MyNSLog(FORMAT, ...)

#endif

上述代码中详细列举了四种较为常用的NSLog的封装,一些事参考了网友的写法,已做实际验证。


补充:

1)VA_ARGS是一个可变参数的宏,很少人知道这个宏,这个可变参数的宏是新的C99规范中新增的,目前似乎只有gcc支持(VC6.0的编译器不支持)。宏前面加上##的作用在于,当可变参数的个数为0时,这里的##起到把前面多余的","去掉的作用,否则会编译出错, 你可以试试。

2)FILE宏在预编译时会替换成当前的源文件名

3)LINE宏在预编译时会替换成当前的行号

4)FUNCTION宏在预编译时会替换成当前的函数名称

下一步是Debug和Release环境的设置:

1."Target > Build Settings > Preprocessor Macros > Debug" 里有一个"DEBUG=1",这保证了我们的条件编译的"#if"可以编译。如果没有,请自行添加,注意和代码中的#if后面的字段保持一致。

2017-11-17-1

2.环境配置见下图,通过切换Debug和Release,可以控制当前工程的编译环境,当在release环境下时,pch预编译的NSLog相关函数执行是无效的。

2017-11-17-2 2017-11-17-3

2.通过自定义条件编译条件全局控制

1.首先自定义全局环境条件编译控制字段

/**

*  工程全局环境控制

*

*  0:开发环境  1:发布环境  2:测试环境

*/

#define MY_PROJECT_GLOBAL_CONTROL 0

上面的0、1、2看个人习惯,只要分得清楚各种环境就行。具体工程的编译环境当然也不局限于上述三类。

在开发或上线时,只要记得修改上述的值以对应于相应的环境就行,当然最好是工程有对应的几个target,这样也就可分别设置,分别使用,不会混淆了。

2.同方法1一样,添加下面的代码:

#if (MY_PROJECT_GLOBAL_CONTROL == 0)

#define AllLog(fmt, ...) NSLog((@"[文件名:%s]\n" "[函数名:%s]\n" "[行号:%d] \n" fmt), __FILE__, __FUNCTION__, __LINE__, ##__VA_ARGS__);

#define DeBugLog(fmt, ...) NSLog((@"%s [Line %d] " fmt), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__);

#define NSLog(...) NSLog(__VA_ARGS__);

#define MyNSLog(FORMAT, ...) fprintf(stderr,"[%s]:[line %d行] %s\n",[[[NSString stringWithUTF8String:__FILE__] lastPathComponent] UTF8String], __LINE__, [[NSString stringWithFormat:FORMAT, ##__VA_ARGS__] UTF8String]);

#elif (MY_PROJECT_GLOBAL_CONTROL == 1)

#define AllLog(...)

#define DeBugLog(...)

#define NSLog(...)

#define MyNSLog(FORMAT, ...)

#endif

上述省略了测试环境,测试同开发即可。

这种方式较1更为灵活。对应的条件编译当然也不仅仅局限于NSLog,还有NSAssert或者是对应环境的接口等的设置。

相关Demo在这里呢

原文:

http://www.jianshu.com/p/2e79436e5fe3

相关文章

  • iOS中 项目中的NSLog的处理

    在iOS开发过程中,我们经常要用到NSLog来打印一些调试信息,而且一般是习惯性的大量使用,在模拟器上运行可能没有...

  • 关于NSLog

    关于NSLog log 用来输出日志信息。所以 iOS 项目中中的NSLog 也是非常之多。你们项目中肯定有这种代...

  • IOS开发中 NSLog的处理

    NSLog 函数打印信息是 IOS 开发中最简单的代码调试方法,但是 NSLog 本身的性能很差,程序发布后,不应...

  • iOS 中pch文件消除项目中所有的NSLog函数

    iOS 中pch文件的使用及利用pch文件消除项目中所有的NSLog函数 在实际的项目中,我们可能需要一些全局的宏...

  • IOS NSLog宏定义

    IOS NSLog宏定义 标签(空格分隔): IOS IOS NSLog宏定义 宏定义NSLog方法,不用加";"...

  • iOS中宏定义处理NSLog

    1.新建PCH文件 1.存放一些全局的宏(整个项目中都用得上的宏) 2.用来包含一些全部的头文件(整个项目中都用得...

  • iOS 消除项目中的nslog函数

    在pch文件里编写如下代码 //消除文件中的nslog函数 #ifdef __OPTIMIZE__ #define...

  • 项目中的NSLog

    在项目的过程中,经常遇到要在调试的时候打印log,但是上线或是release 的时候不需要去显示log 的情...

  • 如何屏蔽NSLog

    在iOS开发中,大家经常会使用NSLog跟踪应用中可能产生的问题。但是NSLog会消耗资源,所以在Release的...

  • iOS开发NSLog打印处理

    我们在开发的时候,经常会应为验证一些数据,去打印出来查证,项目进行过程中会有越来越多的NSLog,输出很多信息,看...

网友评论

      本文标题:iOS中 项目中的NSLog的处理

      本文链接:https://www.haomeiwen.com/subject/pqdgattx.html