iOS開発においてNSLogを利用する事が度々あると思いますが、
それらを少し便利するようなTipsのご紹介を。
※若干俺得感がありますが。
以前もブログに簡単に書いたのですが、記事が分かれてしまっていたので
まとめる意味も込めて。
iOS向け Xcode開発Tips入門編 -とりあえず最初にやってること-
【iOS】 Xcode開発Tips入門編その3 -NSLogあれこれ3つほど-
こちらにも紹介しましたが、マクロを使う事でよりログ出力がよりシンプルに
実装できます。
0. デバッグ時のみに出力し、リリース時には出力をしない。
NSLogで出力しているものをそのままリリースすると
だだ漏れするという問題が発生するので、
#ifndef DEBUG
#define NSLog(...)
#endif
などとする事で、デバッグ時以外は出力されなくなります。
###1.出力時の関数名及び行数を出力させる
NSLogでは、
//クラス名及び関数名
NSLog(@"%s", __func__);
//クラス名及び関数名
NSLog(@"%s",__FUNCTION__);
//クラス名及び関数名
NSLog(@"%s",__PRETTY_FUNCTION__);
//行番号
NSLog(@"%d",__LINE__);
にようにする事で、関数名や行数を出力してくれます。
ただ毎回書くのは面倒なので、
#ifdef DEBUG
#define LOG(fmt,...) NSLog((@"%s %d "fmt), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__);
#else
#define NSLog(...)
#endif
と定義し、
LOG(@"hoge");
とすると、自動的に、関数名及び行数が表示されるようになります。
###2.CGPoint/CGSize/CGRect などを一括で出力する。
NSLog(@"%@",NSStringFromCGRect(self.view.frame));
NSLog(@"%@",NSStringFromCGSize(self.view.frame.size));
NSLog(@"%@",NSStringFromCGPoint(self.view.frame.origin));
とこのように、NSStringFrom...系のメソッドを使うと、
出力する事が可能です。
ただこれらのメソッドは長いので、ちょっと使うのが億劫だったりしまして。。
なので、
#define LOGRect(RECT) NSLog(@"%@",NSStringFromCGRect(RECT));
と定義するなどして
LOGRect(self.view.frame);
などという利用もできます。
ちなみに、
NSStringFromClassなどのメソッドも用意されていて
NSLog(@"%@", NSStringFromClass([self class]));
などとするとクラス名を出力する事も可能です
###3.コールスタック を出力する。
このあたりは、デバッグ時の一つの情報として
NSLog(@"%@" , [NSThread callStackSymbols]);
とするとコールスタックが出力する事が可能です。
###おまけ xxx-Prefix.pchファイルに記述する。
ログに関する定義などはプロジェクト全体で利用したいため、
通常特定のヘッダファイルに書いたとしても、別のクラスなどでは
そのヘッダファイルをimportしない限りは利用する事ができません。
このようにプロジェクト全体にかかわるような記述は、
pchファイルに書くと各ファイルでも利用する事が可能になります。
以上です。