NSLogデバッグテクニック


アップルは最近、デバッグに関するドキュメントを更新しました.今、よく知らない知識を記録してください.
スケッチ法でnumbersを出力する
double myNumber = 7.7;
NSLog( @"number: %@", @ (myNumber) );

出力:
number: 7.7

出力環境情報
マクロ#マクロ#
フォーマット説明子
説明
__func__
%s
現在の関数の署名
__LINE__
%d
ソースファイルの現在の行番号
__FILE__
%s
ソースファイルのフルパス
__PRETTY_FUNCTION__
%s
に類似func__,ただし、C++コードに含まれる詳細なタイプ情報.
表現
フォーマット説明子
説明
NSStringFromSelector(_cmd)
%@
現在のセレクタの名前. 
NSStringFromClass([self class])
%@
現在のオブジェクトクラスの名前. 
[[NSString stringWithUTF8String:__FILE__] lastPathComponent]
%@
ソースファイルの名前. 
[NSThread callStackSymbols]
%@
プログラマが読み取り可能な文字列の現在のスタックが追跡するNSArray.デバッグにのみ使用できます.エンドユーザーに表示したり、プログラムで論理をしたりしないでください.
例1:
NSLog( @"calling: %s", __PRETTY_FUNCTION__ );

出力:
calling : -[MyObjectClassName pressButton:]

例2:
NSLog( @"%@", [NSThread callStackSymbols] );
出力:
2014-04-30 18:44:30.075 AVCustomEdit[52779:60b] (
 0  AVCustomEdit      0x0000efa6 -[APLSimpleEditor buildCompositionObjectsForPlayback:] + 278
 1  AVCustomEdit      0x0000686e -[APLViewController viewDidAppear:] + 590
 2  UIKit             0x007a4099 -[UIViewController _setViewAppearState:isAnimating:] + 526
 3  UIKit             0x007a4617 -[UIViewController __viewDidAppear:] + 146
 4  UIKit             0x007a49aa -[UIViewController _executeAfterAppearanceBlock] + 63
 5  UIKit             0x0069f0d0 ___afterCACommitHandler_block_invoke_2 + 33
 6  UIKit             0x0069f055 _applyBlockToCFArrayCopiedToStack + 403
 7  UIKit             0x0069ee9a _afterCACommitHandler + 568
 8  CoreFoundation    0x029db2bf __CFRunLoopDoObservers + 399
 9  CoreFoundation    0x029b9254 __CFRunLoopRun + 1076
 10 CoreFoundation    0x029b89d3 CFRunLoopRunSpecific + 467
 11 CoreFoundation    0x029b87eb CFRunLoopRunInMode + 123
 12 GraphicsServices  0x0318b5ee GSEventRunModal + 192
 13 GraphicsServices  0x0318b42b GSEventRun + 104
 14 UIKit             0x00681f9b UIApplicationMain + 1225
 15 AVCustomEdit      0x000026bd main + 141
 16 libdyld.dylib     0x0269e701 start + 1
)

DEBUGの使用
NSLogはリソースを消費するので、プログラムを発行した後、NSLogを注釈する必要があります.
最初のテクニック:
プロジェクトの設定には、あらかじめ定義されたDEBUGがあります.デバッグ時にのみ1に割り当てられます.したがって,DebugモードのみでコンパイルされたNSLogを実現することができる.
#if DEBUG
NSLog( @"preparing to press button!" );
#endif
出力:
preparing to press button!

高度なテクニック:
pchファイルに次のコードを追加して、デバッグ時にのみ出力を実行できます.
#ifdef DEBUG

#define NSLog(...) NSLog( __VA_ARGS__ )

#else

#define NSLog(...) {}

#endif