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

**追記:**
良い子のみんなはこんなマクロを自分で定義する前に[UIKit Function - String Conversions](https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIKitFunctionReference/index.html#//apple_ref/doc/uid/TP40006894-CH3-SW34)とか[CocoaLumberjack](https://github.com/CocoaLumberjack/CocoaLumberjack)とか使うんだよ！！！！！

---

ログは出したいけどリリースビルド時には出したくないという時に使う各種ログマクロです。
個人的に使っているもののまとめです。(オープンソース見ているといろいろな種類見かけますね)

プロジェクトを作るとテンプレで出来る「アプリ名-Prefix.pch」というヘッダに書くとどのソースでも使えるようになるので便利です。

```objectivec: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
```

```objectivec:使用例

/* 普通の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>>
*/


```