iPhone
Xcode
iOS
iPhone開発

NSLogをちょっと便利にするTips

More than 5 years have passed since last update.

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ファイルに書くと各ファイルでも利用する事が可能になります。

以上です。