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