iOS開発でのNSLogはDEBUGマクロで使おう




今更ネタになりますがiOS開発でデバック処理をする際に
NSLogを利用する事が多いと思います。


そのままうっかり、NSLogを埋め込んだまま申請してしまう事あるんじゃないでしょうか?


実はこれが意外と危険だったりします。




NSLogの出力内容はリリース後のアプリからでも見る事が可能だからです。
実機をPCにつないでOrganizerとか
iPhone構成ユーティリティ開いてアプリ起動して見ると見れちゃいます。



NSLogAPI処理のURL情報とかパラメータとか書いてあったら・・・
考えただけでもコワすぎです。



という事でNSLogデバック時のみ出力するためにC言語マクロを使って出力しましょうという所が今回。



前準備としては以下を-prefix.pchファイルに追記します。
(-prefix.pchファイルに記載しておけば、特にimportとか気にせずどこからでも利用できます)

#ifdef DEBUG
#define DLog(fmt, ...) NSLog((@"%s [Line %d] " fmt), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__);
#else
#define DLog(...)
#endif

// ALog always displays output regardless of the DEBUG alarm
#define ALog(fmt, ...) NSLog((@"%s [Line %d] " fmt), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__);



C言語のプリプロセッサ※1#ifdef文を利用して
Preprocessor MacrosでDEBUG設定されていた場合は
DLog記載情報に対し、NSLog出力を行います。
DEBUG設定がない場合はDLogと記載された情報は特に何も処理しないといった感じになります。
※1プリプロセッサについてはこことかでご確認ください


ちなみに、ALogの方は見ての通り、デバックモードと関係なく出力したい情報があった場合に使用します。
例えば、システムエラー等でログ情報としてリリース後も残したい場合などです。



マクロ※2の内容としてはざっと以下の感じになります。

マクロ名 内容
__PRETTY_FUNCTION__ クラス名とメソッド名の取得
__LINE__ 行数の取得
##__VA_ARGS__ Logに出力する情報取得
※2マクロについてはこことかでご確認ください



実際にViewContorllerクラスのViewDidLoadに以下のように記載して実行してみます。

#pragma mark - View lifecycle

- (void)viewDidLoad
{
    [super viewDidLoad];
	// Do any additional setup after loading the view, typically from a nib.
    DLog(@"test!!!");
}

[実行結果のコンソール]


2012-05-02 00:42:52.454 NSLogTest[4196:f803] -[ViewController viewDidLoad] [Line 25] test!!!



ちなみにLog出力情報として文字列は特に出したくないけど、きちんと処理が通ってるか確認したいとかって場合は
NSLogと違って引数無しで出力する事も可能です。

#pragma mark - View lifecycle

- (void)viewDidLoad
{
    [super viewDidLoad];
	// Do any additional setup after loading the view, typically from a nib.
    DLog();
}

[実行結果のコンソール]


2012-05-02 00:51:14.719 NSLogTest[4295:f803] -[ViewController viewDidLoad] [Line 25]



もちろん、通常のNSLog同様、引数に文字列等を表示させる事も可能です。

#pragma mark - View lifecycle

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    NSString* string = @"test!!!";
    DLog(@"test!!! %@",string);
}

[実行結果のコンソール]


2012-05-02 01:02:03.630 NSLogTest[4561:f803] -[ViewController viewDidLoad] [Line 26] test!!! test!!!



DEBUGマクロXCode定義は
PROJECTBuild SettigsApple LLVM compiler 3.0 - Preprocessiong
Preprocessor Macrosになります。



これでNSLogで情報だだ漏れを回避できますね。


ではでは〜






Shareしていただけると励みになりますので
良ければよろしくお願いします