关闭

让 IPhone 程序的调试信息只在 debug 模式下输出 转自:hager的博客

1178人阅读 评论(0) 收藏 举报
 iPhone 应用发布后,程序运行过程中尽量不要有调试 log 信息输出,因为这样会影响程序运行的效率。通过宏定义设置,使得程序只在 debug 模式下输出这些只对于我们开发者有用的信息,而 release 时不会输出。
一、设置步骤如下:
1、首先建立一个宏定义文件,在其中加入如下代码:

//! 1、XCode 中设置控制
// Target > Get Info > Build > GCC_PREPROCESSOR_DEFINITIONS
// Configuration = Release: <empty>
//               = Debug:   DEBUG_MODE=1
//!2、人为控制
//#define DEBUG_MODE 
#ifdef DEBUG_MODE
#define DebugLog( s, ... ) NSLog( @"<%p %@:(%d)> %@", self, [[NSString stringWithUTF8String:__FILE__] lastPathComponent], __LINE__, [NSString stringWithFormat:(s), ##__VA_ARGS__] )
#else
#define DebugLog( s, ... ) 
#endif
 
2、在 Target 的 Bulid 搜索 GCC_PREPROCESSOR_DEFINITIONS(或者 preprocessor macros),没有自己创建一个
3、选择 左上角的 Configuration 的 Debug,在左下角的下拉框选择->Edit Definition at this Level ,添加 DEBUG_MODE=1
4、选择左上角的Configuration: Release,确认没有设置 DEBUG_MODE 的值

二、使用:
首先相应有调试信息的文件中包含此宏文件,使用DebugLog替代cocoa的NSLog,格式化输出的方式一样。



我们平时在开发应用的时候,经常会用到 NSLog 来调试我们的程序,而随着项目越来越大,这些用于调试的日志输出就会变得很难管理。 发布正式版的时候一定要屏蔽掉所有后台输出,因为这些输出还是比较消耗系统资源的。  往往到了这个时候,我们不得不去一行一行的找到 NSLog 调用,然后注释掉。 这样做在项目小的时候还比较有效,但随着项目规模的增长,就会变得越来越难控制。  下面就给大家介绍一个简单的方法,让我们在生成 Release 版本时不需要进行任何更改即可屏蔽所有的 Log 输出。

    首先我们先要定义这样一段预处理命令,文件名随便起,例如 CLog.h

    #ifdef DEBUG
    #define CLog(format, ...) NSLog(format, ## __VA_ARGS__)
    #else
    #define CLog(format, ...)
    #endif

    这里我们判断 DEBUG 这个宏是否定义,如果有定义我们就将这个 CLog 宏替换成 NSLog 调用,而如果没有定义过 DEBUG 标志我们就直接跳过。这点应该不难理解。

    检查 DEBUG 标志是否正确定义,Xcode 一般会在 debug 运行配置项里面已经定义号了DEBUG 标志,如果没定义我们就自己写上,以我的 Xcode 4 为例,如下图:

    找到 PreProcessor Macros 这个属性,对于 Debug 配置我们给他写上 DEBUG,而在 Release 配置中把它留空。 这样我们刚才那段预处理命令就可以根据这个标志来判断我们编译的时调试版本还是发布版本,从而控制 NSLog 的输出。 (因为 Xcode 4 会把 debug/release 两个配置项同时对比展现出来,而 3.x 版本的只能分别设置,如果你用的时xcode 3.x 开发工具, 那么就分别对 Debug/Release 都检查一下)。

    到了这里我们这个判断工作就都进行完了,不过这里还有一点比较麻烦,就是我们如果想实用 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,就会输出日志,反之则什么都不会输出。




PS:这样我们就可以做到log调试信息在release时不会输出,同时省去了人为疏忽,发布时忘了修改调试标志!
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:1104716次
    • 积分:15286
    • 等级:
    • 排名:第721名
    • 原创:405篇
    • 转载:193篇
    • 译文:23篇
    • 评论:84条
    博客专栏
    文章分类