iPhoneのデバッグログの改善

iPhoneの開発用のログはたいていNSLogで出力するわけですが、リリースの時には抜きたかったりするので、個別にdefineで切り分けたりしておくのが通常の方法だと思いますが、下記の仕組みでは、デバッグとリリースの切り分けだけでなく、ログにクラスと関数名も出力してもらえます。

http://www.cimgf.com/2010/05/02/my-current-prefix-pch-file/

やりかたは簡単。

プロジェクト→プロジェクト設定を編集→ビルド
でその他のCフラグに-DDEBUGを追加

その後、XXX_Prefix.pchに以下の行を追加すればOK

#ifdef DEBUG
  #define DLog(...) NSLog(@"%s %@", __PRETTY_FUNCTION__, [NSString stringWithFormat:__VA_ARGS__])
  #define ALog(...) [[NSAssertionHandler currentHandler] handleFailureInFunction:[NSString stringWithCString:__PRETTY_FUNCTION__ encoding:NSUTF8StringEncoding] file:[NSString stringWithCString:__FILE__ encoding:NSUTF8StringEncoding] lineNumber:__LINE__ description:__VA_ARGS__]
#else /* DEBUG */
  #define DLog(...) do { } while (0)
  #ifndef NS_BLOCK_ASSERTIONS
    #define NS_BLOCK_ASSERTIONS
  #endif
  #define ALog(...) NSLog(@"%s %@", __PRETTY_FUNCTION__, [NSString stringWithFormat:__VA_ARGS__])

#define ZAssert(condition, ...) do { if (!(condition)) { ALog(__VA_ARGS__); }} while(0)
#endif /* DEBUG */

NSLogをDLogに置き換えます。あとはALog,ZAssertというAssert系のものが利用可能です。

  • ALog Assertのconditionがないバージョン。ReleaseではAssertじゃなくて、ログが出力される
  • ZAssert conditionつきALog