リリースビルド時にNSLogをきれいさっぱり消す方法

でらうま倶楽部 : iPhone リリースビルド時に余計なコードをまとめて省く、Objective-Cなりの書き方。
http://blog.livedoor.jp/tek_nishi/archives/3449727.html

でらうま倶楽部 : Objective-C プロトコルを最短で理解するプログラム例 の記事を参考にさせて頂いたの、御礼がてら。

C言語の定番として、マクロを使うという手がありますね。以前、業務で良く使っていました。

#ifdef _DEBUG
#define NSLOG(_x) NSLog _x
#else
#define NSLOG(_x)
#endif

と定義しておいて、

void Main()
{
	// 通常の実行
	Calc *calc = [Calc alloc];
	int ans = [calc add:10 at:20];
	NSLOG(([NSString stringWithFormat:@"ans: %d", ans ]));

	// nilの場合の実行
	calc = nil;
	ans = [calc add:10 at:20];
	NSLOG(([NSString stringWithFormat:@"ans: %d", ans ]));
}

のようにログを書きます。「NLOG(( … ));」のように、括弧を2重に重ねるのが気持ち悪いですが、こうすると綺麗さっぱり消えます。まあ、ログなので括弧が2重になってもokかなと。
これの派生バージョンで、C++ では、__FILE__, __LINE__ を使って簡易的にログ出力できるようなマクロを組んだりします。

~ 追記

… が、最近の vc++ では、__VA_ARGS__ が使えるんですね。知らんかった。gcc は使えるのですが、昔の vc++ は使えなかったもので。

#ifdef _DEBUG
#define NSLOG(...) NSLog(__VA_ARGS__)
#else
#define NSLOG(...)
#endif

としておいて、

	NSLOG(@”debug message");

とかで十分。

カテゴリー: Objective-C パーマリンク