iOS開発:NSLogはプリプロセッサで制御
NSLog関数でログを出力する。NSLogでログ出力していると、リリースビルドの時もログが出てしまう。C言語でも定番のプリプロセッサを利用して、リリース時に出したくないログなどを制御する。
参考サイト:
- 条件付きコンパイル プリプロセッサディレクティブ
- iOS開発でのNSLogはDEBUGマクロで使おう – k2ダイアリー
- 便利なマクロ・カテゴリ・ライブラリまとめ #iOS #AdventCalendar #Objective-C – Qiita
プリプロセッサ定数を定義
Xcodeを開いて、[Project] > [Supporting Files] > [App-Prefix.pch] で定義する。
[c]
#ifdef DEBUG
#define DLog(fmt, …) NSLog((@"%s (%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 (%d) " fmt), __PRETTY_FUNCTION\_, __LINE__, ##__VA_ARGS\_);
[/c]
ログを利用する
ログを利用するときは、以下のように書く。
[c]
– (void)func {
DLog();
DLog(@“log:%@”, self.name);
}
[/c]
ログはこのように出力される。
[ModelClass func:] (69)
[ModelClass func:] (69) log:name
ビルド設定を変更
プロジェクトの設定で、DEBUG定数が定義されていることを確認する。ついでに、DEBUG_CODE定数も定義しておいた。
”DEBUG=1”が2つもあるのはなぜ??”DEBUG”と書かれているだけでもOKなはず。
デバッグ用コードの利用
先ほど、デバッグ用コードのための定数も用意した。これを使って、デバッグのみに実行したいコードを書くこともできる。
[c]
– (void)func {
#if DEBUG_CODE
NSLog(@“log:%@”, self.name);
#endif
}
[/c]
デバッグ時のみ、複雑なログ出力処理を動かしたいときなどに便利。テスト用コードを埋め込むことも出来る。スタブの切替などにも使えると思う。
こうやってログの事を書くと、アスペクトが気になってくる。ちょっとググってみたところ、AspectCocoaというものがあるようだ。