追記:
良い子のみんなはこんなマクロを自分で定義する前にUIKit Function - String ConversionsとかCocoaLumberjackとか使うんだよ!!!!!
ログは出したいけどリリースビルド時には出したくないという時に使う各種ログマクロです。
個人的に使っているもののまとめです。(オープンソース見ているといろいろな種類見かけますね)
プロジェクトを作るとテンプレで出来る「アプリ名-Prefix.pch」というヘッダに書くとどのソースでも使えるようになるので便利です。
xxx-Prefix.pch
#ifdef DEBUG
#define LOG(...) NSLog(__VA_ARGS__)
#define LOG_PRINTF(FORMAT, ...) printf("%s\n", [[NSString stringWithFormat:FORMAT, ##__VA_ARGS__] UTF8String]);
#define LOG_METHOD NSLog(@"%s", __func__)
#define LOG_METHOD_AND_ABORT LOG_METHOD; abort()
#else
#define LOG(...)
#define LOG_PRINTF(FORMAT, ...)
#define LOG_METHOD
#define LOG_METHOD_AND_ABORT
#endif
#ifdef DEBUG
#define LOG_POINT(p) NSLog(@"%f, %f", p.x, p.y)
#define LOG_SIZE(p) NSLog(@"%f, %f", p.width, p.height)
#define LOG_RECT(p) NSLog(@"%f, %f - %f, %f", p.origin.x, p.origin.y, p.size.width, p.size.height)
#else
#define LOG_POINT(p)
#define LOG_SIZE(p)
#define LOG_RECT(p)
#endif
#if DEBUG
@interface UIView (DebugPrivate)
- (NSString*)recursiveDescription;
@end
#endif
使用例
/* 普通のNSLogと同じように使えます */
LOG(@"debug log");
// 2013-02-21 00:20:53.025 Test[1235:c07] debug log <UIView: 0x719b9d0; frame = (0 20; 320 548); autoresize = RM+BM; layer = <CALayer: 0x719b140>>
/* 先頭のタイムスタンプ等をなしに */
LOG_PRINTF(@"debug log %@", self.view);
// debug log <UIView: 0x719b9d0; frame = (0 20; 320 548); autoresize = RM+BM; layer = <CALayer: 0x719b140>>
/* クラスとメソッド名を表示 */
LOG_METHOD;
// -[ViewController viewDidLoad]
// 下記でもセレクタはわかりますが__func__だとクラス名も出るので__func__使ってます
NSLog(@"%@", NSStringFromSelector(_cmd));
// viewDidLoad
/* LOG_METHOD_AND_ABORTのところでクラッシュします。
デバッグ中に明示的に止めたい時に使ってます */
switch (x) {
case 0:
break;
case 1:
break;
default:
LOG_METHOD_AND_ABORT;
break;
}
/* CGPointの表示 */
LOG_POINT(self.view.center);
// 160.000000, 294.000000
/* CGSizeの表示 */
LOG_SIZE(self.view.frame.size);
// 320.000000, 548.000000
/* CGRectの表示 */
LOG_RECT(self.view.frame);
// 0.000000, 20.000000 - 320.000000, 548.000000
/* 番外: マクロではないですが、有名なプライベートメソッドでそのviewとsubviews以下を全て表示出来ます
プライベートメソッドを呼び出すと審査が通らないので、DEBUG時にのみ有効にして
仮に外し忘れていてもリリースビルドでは通らないようにしています */
NSLog(@"%@", [self.view.window recursiveDescription]);
/*
<UIWindow: 0x7654d10; frame = (0 0; 320 568); autoresize = W+H; layer = <UIWindowLayer: 0x76558c0>>
| <UIView: 0x7673620; frame = (0 20; 320 548); autoresize = RM+BM; layer = <CALayer: 0x7672d90>>
| | <UILabel: 0x7673760; frame = (139 156; 42 21); text = 'Label'; clipsToBounds = YES; opaque = NO; autoresize = TM+BM; userInteractionEnabled = NO; layer = <CALayer: 0x7672ca0>>
| | <UIRoundedRectButton: 0x7675050; frame = (123.5 252; 73 44); opaque = NO; autoresize = TM+BM; layer = <CALayer: 0x7675190>>
| | | <UIGroupTableViewCellBackground: 0x76759d0; frame = (0 0; 73 44); userInteractionEnabled = NO; layer = <CALayer: 0x7675aa0>>
| | | <UIImageView: 0x7676f80; frame = (1 1; 71 43); opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x7677250>> - (null)
| | | <UIButtonLabel: 0x76764d0; frame = (12 12; 49 19); text = 'Button'; clipsToBounds = YES; opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x76765c0>>
*/