Hatena::ブログ(Diary)

中継地点 RSSフィード Twitter

2011-07-07

デバッグ用マクロの活用

デバッグ時のみにログを出力したい等、私の場合はプリプロセッサマクロの設定とifdefで切り分けるという原始的な方法で対応しています。具体的には Prefix.pchで色々な種類のマクロを定義し、DEBUGフラグで出力を制御するようにします。


f:id:h_mori:20110705151704p:image

プロジェクトのBuild Settingsで「Preprocessor Mocros」のDebugの引数に「DEBUG」を設定します。


_Prefix.pchの記述

#ifdef __OBJC__
    #import <Foundation/Foundation.h>
    #import <UIKit/UIKit.h>
#endif

#ifdef DEBUG
#define LOG(...) NSLog(__VA_ARGS__)
#define LOG_CURRENT_METHOD NSLog(@"%@/%@", NSStringFromClass([self class]), NSStringFromSelector(_cmd))
#define LOG_TIMER_START(...) fprintf(stderr,"TIMER start -- %s -- (%d)\n",__STRING(__VA_ARGS__),__LINE__);NSDate *__VA_ARGS__=[NSDate date]
#define LOG_TIMER_END(...) fprintf(stderr,"TIMER end   -- %s -- (%d): %f s\n",__STRING(__VA_ARGS__),__LINE__,-[__VA_ARGS__ timeIntervalSinceNow])
#define LOG_RETAINCOUNT(var) fprintf(stderr,"-- %s.retainCount=%d --\n",__STRING(var),[var retainCount])
#else
#define LOG(...) 
#define LOG_CURRENT_METHOD 
#define LOG_TIMER_START(...) 
#define LOG_TIMER_END(...) 
#define LOG_RETAINCOUNT(var)
#endif

ここで定義したマクロは、Releaseビルドモジュールには含まれなくなります。


各種マクロの説明

  • LOG

  NSLogの代わりに使用する

  • LOG_CURRENT_METHOD

  クラス名とメソッド名がログ出力される。各メソッドの最初に記載しておくとメソッドのログトレースが行える。

  • LOG_TIMER_START, LOG_TIMER_END

  タイマーログのマクロロジックのパフォーマンス計測等に利用する。STARTとENDはセットで使う。

  • LOG_RETAINCOUNT

  変数のretainCountを調べるマクロ


アイディア次第で色々と便利な使い道が出来そうです。

ログ程度の利用なら別にもっといい方法があるかもしれません。

Connection: close