at_yasu's blog

ロード的なことを

NSLogとマクロ

私個人で、よくgccのオプションに-DDEBUGを追加しています。Debugビルドの時にだけ。

そしてソフトウェアをReleaseビルドの時、Xcodeで起動するのではなく、単体で起動した時にはNSLogの結果が全て/var/log/messagesystem.logに行きます。

ログファイルがかなり冗長になっちゃうので、個人的に書きのようなマクロを使って、Releaseビルドの時だけNSlogを吐かないようにしています。


下記のMyAssertの使い方はNSAssertと似ていて、違いは条件文を書かないだけです。

#ifndef DEBUG
# define DEBUG 1
#endif

#ifndef MyAssert
#define MyAssert(str)   if (!DEBUG) NSLog( @"[%s] line:[%d] " str , __FILE__, __LINE__ )
#define MyAssert1(str,arg1) \
						if (!DEBUG) NSLog((@"[%s] line:[%d] " str), __FILE__, __LINE__ , (arg1))
#define MyAssert2(str,arg1,arg2) \
						if (!DEBUG) NSLog((@"[%s] line:[%d] " str), __FILE__, __LINE__ , (arg1), (arg2))
#define MyAssert3(str,arg1,arg2,arg3) \
						if (!DEBUG) NSLog((@"[%s] line:[%d] " str), __FILE__, __LINE__ , (arg1), (arg2), (arg3))
#define MyAssert4(str,arg1,arg2,arg3,arg4) \
						if (!DEBUG) NSLog((@"[%s] line:[%d] " str), __FILE__, __LINE__ , (arg1), (arg2), (arg3), (arg4))
#define MyAssert5(str,arg1,arg2,arg3,arg4,arg5) \
						if (!DEBUG) NSLog((@"[%s] line:[%d] " str), __FILE__, __LINE__ , (arg1), (arg2), (arg3), (arg4), (arg5))
#endif /* MyAssert */


ただ、If文を使ってるからコンパイルしたら、NSLogを「ifdef DEBUG」で囲った時より比較的遅くなって、ベンチマークでは影響あると思う。

NSAssertが個人的には使いずらい・・・

他の方法(2010/04/13 更新)

他にもっとスマートな方法があった。

#ifdef DEBUG
#    define DLog(...) NSLog(__VA_ARGS__)
#else
#    define DLog(...) /* */
#endif
#define ALog(...) NSLog(__VA_ARGS__)

via Dropping NSLog in release builds | Cocoa Is My Girlfriend