LoginSignup
157
153

More than 5 years have passed since last update.

NSLog デバッグ用の各種ログマクロまとめ

Last updated at Posted at 2013-02-20

追記:
良い子のみんなはこんなマクロを自分で定義する前に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>>
*/


157
153
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
157
153