DebugとReleaseの状態の変化に応じてログ出力を制御

2464 ワード

変換元:http://www.cocoachina.com/macdev/tips/2011/0506/2838.html
私たちは普段アプリケーションを開発するとき、NSLogを使ってプログラムをデバッグすることがよくありますが、プロジェクトが大きくなるにつれて、デバッグ用のログ出力は管理しにくくなります.正式版をリリースするときは、システムリソースを消費しているため、すべてのバックグラウンド出力を遮断する必要があります.往々にしてこの時になって、私たちは1行1行のNSLog呼び出しを見つけて、それから注釈しなければなりません.このようにするのはプロジェクトが小さいときには効果的ですが、プロジェクトの規模が大きくなるにつれて、ますますコントロールしにくくなります.以下では、Releaseバージョンを生成する際に変更することなく、すべてのLog出力をブロックする簡単な方法を紹介します.
まず、DebugLog.hなどのファイル名を任意に開始する前処理コマンドを定義します.
#ifdef  DEBUG
#define DebugLog(format, ...) NSLog(format, ## __VA_ARGS__)

#else
#define DebugLog(format, ...)
#endif

ここではDEBUGというマクロが定義されているかどうかを判断し、定義があればこのDebugLogマクロをNSLog呼び出しに置き換え、DEBUGフラグが定義されていなければ直接スキップします.この点は理解に難くないはずだ.DEBUGフラグが正しく定義されているかどうかを確認します.Xcodeは一般的にdebug実行構成項目にDEBUGフラグが定義されています.定義されていない場合は自分で書きます.私のXcode 4を例にとると、Preprocessor Macrosという属性を見つけ、Debug構成についてはDEBUGを書き、Release構成では空にします.これにより、先ほどの前処理コマンドでは、このフラグに基づいて、コンパイル時にバージョンをデバッグするか、リリースするかを判断し、NSLogの出力を制御することができます.(Xcode 4はdebug/releaseの2つの構成項目を同時に比較して表示するため、3.xバージョンは別々に設定するしかありません.xcode 3.x開発ツールを使用する場合は、それぞれDebug/Releaseをチェックします).ここまで来たらこの判断は終わりますが、ここではもう一つ面倒なことに、DebugLogマクロを実用化するには、DebugLog.hというヘッダファイルをインポートしなければなりません.しかし、Xcodeは私たちに非常に巧みな解決策を提供してくれました.プロジェクトのファイルを自分で見てみましょう.xxx-prefix.pchというファイルがあるのではないでしょうか.pchという拡張子に気づくだけでいいです.この書類は何に使いますか.次はpchファイルのサンプルです.
#import <Availability.h>

#ifndef __IPHONE_3_0
#warning "This project uses features only available in iOS SDK 3.0 and later."
#endif

#ifdef __OBJC__
    #import <UIKit/UIKit.h>
    #import <Foundation/Foundation.h>
#endif

ここではいくつかのヘッダファイルを導入しましたが、実はXcodeのプリコンパイルメカニズムで、私たちは1つのプロジェクトをコンパイルするとき、多くのよく使われるソースファイルがあり、これらのコードファイルはほとんど修正されていないので、Xcodeはこれらのファイルを早期に1回だけコンパイルして、私たちの後の複数回の構築過程で繰り返し実用化します.例えば、ここのUIKEtとFoundationでは、このようなメカニズムは、プロジェクトを構築するたびに速度を速めることができます.もちろん、ここではあまり深く研究する必要はありません.その役割を知ってから、私たちはそれを利用して私たちの開発に便利を提供することができます.作成したばかりのDebugLog.hもここに導入するだけで、プロジェクト内のすべてのファイルが定義したDebugLogマクロにアクセスできます.次に、完了したpchファイルを示します.
#import <Availability.h>

#ifndef __IPHONE_3_0
#warning "This project uses features only available in iOS SDK 3.0 and later."
#endif

#ifdef __OBJC__
    #import <UIKit/UIKit.h>
    #import <Foundation/Foundation.h>
    #import "DebugLog.h"
#endif

これでDebugLogは完了し、どのソースファイルでもDebugLogマクロを使用してログを出力できるようになりました.前処理コマンドは現在のコンパイル構成を自動的に判断し、Debugであればログを出力し、逆に何も出力しません.