今天在这里分享一个很实用的小技巧。 我们平时在开发应用的时候,经常会用到NSLog来调试我们的程序,而随着项目越来越大,这些用于调试的日志输出就会变得很难管理。 我们在发布正式版的时候一定要屏蔽掉所有后台输出,因为这些输出还是比较消耗系统资源的。  往往到了这个时候,我们不得不去一行一行的找到NSLog调用,然后注释掉。 这样做在项目小的时候还比较有效,但随着项目规模的增长,就会变得越来越难控制。  下面就给大家介绍一个简单的方法,让我们在生成Release版本时不需要进行任何更改即可屏蔽所有的Log输出。(即提供C++中TRACE的功能,iOS目前居然没有提供,很是失望,估计后续应该会加上吧)

1. 首先我们先要定义这样一段预处理命令,文件名随便起,例如 CLog.h
#ifdef DEBUG
#define CLog(format, ...)  NSLog(format, ## __VA_ARGS__)
#else
#define CLog(format, ...)
#endif

  这里我们判断DEBUG这个宏是否定义(最好用_DEBUG宏,和C++中保持一致),如果有定义我们就将这个CLog宏替换成NSLog调用,
而如果没有定义过DEBUG标志我们就直接跳过。这点应该不难理解。
2. 检查DEBUG标志是否正确定义,xcode一般会在debug运行配置项里面已经定义号了DEBUG标志,
如果没定义我们就自己写上,以我的xcode4 为例,如下图:
 
找到PreProcessor Macros 这个属性,对于Debug配置我们给他写上DEBUG,而在Release配置中把它留空。 这样我们刚才那段预处理命令就可以根据这个标志来判断我们编译的时调试版本还是发布版本,从而控制NSLog的输出。 (因为xcode 4 会把debug/release 两个配置项同时对比展现出来,而3.x版本的只能分别设置, 如果你用的时xcode 3.x 开发工具, 那么就分别对Debug/Release 都检查一下)。
3. 到了这里我们这个判断工作就都进行完了,不过这里还有一点比较麻烦,就是我们如果想实用CLog宏,就必须要导入 CLog.h 这个头文件。 不过xcode为我们提供了一种非常巧妙的解决办法。 我们自己看一下项目里的文件,是不是有一个叫做 xxx-prefix.pch 的文件,只要注意到pch这个扩展名就可以了。 这个文件是做什么用的呢? 下面是一个pch文件的样本:
//
// Prefix header for all source files
//
#import <Availability.h>
#ifndef __IPHONE_3_0
#warning "This project uses features only available in iPhone SDK 3.0 and later."
#endif
#ifdef __OBJC__#import <UIKit/UIKit.h>#import <Foundation/Foundation.h>
#endif

这里引入了一些头文件, 其实是xcode 的一种预编译机制,我们在编译一个项目的时候,会有很多常用的源文件,并且这些代码文件几乎不被修改,所以xcode对这些文件只在早期进行一次编译,以便我们以后的多次构建过程中反复实用。 例如这里的UIKit和Foundation ,这样的机制可以加快我们每次构建项目的速度。 当然这里我们不必太深究它,知道它的作用后,我们就可以利用它来为我们的开发提供便利。 我们只需要将刚刚建立的CLog.h 也在这里面引入一下,这样我们项目中的所有文件就都能够访问到我们刚刚定义的CLog宏了。 下面是完成后的pch文件:
#import <Availability.h>
#ifndef __IPHONE_3_0
#warning "This project uses features only available in iPhone SDK 3.0 and later."
#endif
#ifdef __OBJC__#import <UIKit/UIKit.h>#import <Foundation/Foundation.h>#import "CLog.h"
#endif

这样,我们的CLog就完成了,现在可以在任何一个源文件中实用CLog宏来输出日志,预处理命令会自动判断当前的编译配置,如果是Debug,就会输出日志,反之则什么都不会输出。

转载于:https://blog.51cto.com/isanny/1185429

iOS根据Debug和Release状态的变化来屏蔽日志输出相关推荐

  1. C#根据Debug、Release模式动态加载dll

    //根据Debug.Release状态动态加载dll文件         #if (DEBUG)                 const string dllPathCamera = @" ...

  2. 关于Debug和Release之本质区别的讨论

    一.Debug 和 Release 编译方式的本质区别     Debug 通常称为调试版本,它包含调试信息,并且不作任何优化,便于程序员调试程序.Release 称为发布版本,它往往是进行了各种优化 ...

  3. iOS开发debug集锦

    1.添加第三方库时,需要注意使用环境 duplicate symbol _llvm.embedded.module in:/Users/dengw/360Cloud/xcode_code/applic ...

  4. [你必须知道的.NET]第三十五回,判断dll是debug还是release,这是个问题

    问题的提出 晚上翻着群里的聊天,发现一个有趣的问题:如何通过编码方式来判断一个dll或者exe为debug build还是release build?由于没有太多的讨论,所以我只好自己找点儿办法,试图 ...

  5. Android签名详解(debug和release)

    Android签名详解(debug和release) 1. 为什么要签名 1) 发送者的身份认证 由于开发商可能通过使用相同的Package Name来混淆替换已经安装的程序,以此保证签名不同的包不被 ...

  6. Debug和release版本区别 原码反码补码的转换及存储

    #define _CRT_SECURE_NO_WARNINGS 1  //Debug和release版本区别(VS2019版) //例子 #include<stdio.h> //int m ...

  7. 如何在Release状态下进行调试

    1.如何在Release状态下进行调试 Project->Setting=>ProjectSetting对话框,选择Release状态.C/C++标签中的Category选General, ...

  8. 从零学习Fluter(八):Flutter的四种运行模式--Debug、Release、Profile和test以及命名规范...

    从零学习Fluter(八):Flutter的四种运行模式--Debug.Release.Profile和test以及命名规范 好几天没有跟新我的这个系列文章,一是因为这两天我又在之前的基础上,重新认识 ...

  9. Win10+VS2015平台下OpenCV3.1.0的x86和x64平台的Debug与Release模式的编译与配置

    闲话 昨天晚上在新电脑上重新配置了OpenCV3.1,之前虽然也弄过,不过当时是初学者,只是照着网上的教程简单的配置了Debug模式下x86的运行环境(大部分的教程也只教了这种方式的配置......) ...

最新文章

  1. php判断一个数是否是回文数,每周一道算法题001:回文数
  2. python数据分析工具包_脑成像数据分析:Python工具包
  3. 数据库设计准则(第一、第二、第三范式说明)
  4. crontab -e 运行python的脚本的坑
  5. MySQL高级 - SQL技巧 -日期函数与聚合函数
  6. 实验7-3-1 字符串逆序 (15分)
  7. Mac电脑 hbuilderx 运行到小程序node-sass异常
  8. Java命令:jstat — 查看JVM的GC信息
  9. 【python】 time模块和datetime模块详解 【转】
  10. 一个障碍,就是一个超越自我的契机
  11. 不能执行已释放 Script 的代码
  12. 人人商城数据字典---链接内容
  13. android相机固定焦距,android Camera 设置焦距
  14. 搭建简单的企业网站,华为云速建站和阿里建站哪个好?
  15. 除去工作赚到第一桶金10W+,我都做了哪些事儿?
  16. 什么是集合竞价和连续竞价
  17. 敏捷概念.Stacey矩阵
  18. 理论+实操: MySQL索引与事务、视图、存储过程(软件开发用的多)、存储引擎MyISAM和InnoDB
  19. linux中常用的60个命令及作用详解
  20. Python自动化办公:pdf文档操作

热门文章

  1. Node.js 全局对象
  2. iOS 开发_..和self...的区别以及使用
  3. 关于异常的处理的总结
  4. 50 xen虚拟化技术基础、xen虚拟化技术进阶
  5. IT十八掌作业_java基础第六天_接口与适配器模式、多态、内部类
  6. LVS负载均衡之ipvsadm部署安装(安装篇)
  7. Javascript Java C++系列
  8. oracle何时使用to_date函数
  9. 软件需求分析--三步走
  10. 「珍藏」老司机为你推荐10个炫酷的开源库,看完的人都收藏了