NSLogデバッグテクニック
アップルは最近、デバッグに関するドキュメントを更新しました.今、よく知らない知識を記録してください.
スケッチ法でnumbersを出力する
出力:
出力環境情報
マクロ#マクロ#
フォーマット説明子
説明
__func__
%s
現在の関数の署名
__LINE__
%d
ソースファイルの現在の行番号
__FILE__
%s
ソースファイルのフルパス
__PRETTY_FUNCTION__
%s
に類似func__,ただし、C++コードに含まれる詳細なタイプ情報.
表現
フォーマット説明子
説明
NSStringFromSelector(_cmd)
%@
現在のセレクタの名前.
NSStringFromClass([self class])
%@
現在のオブジェクトクラスの名前.
[[NSString stringWithUTF8String:__FILE__] lastPathComponent]
%@
ソースファイルの名前.
[NSThread callStackSymbols]
%@
プログラマが読み取り可能な文字列の現在のスタックが追跡するNSArray.デバッグにのみ使用できます.エンドユーザーに表示したり、プログラムで論理をしたりしないでください.
例1:
出力:
例2:
NSLog( @"%@", [NSThread callStackSymbols] );
出力:
DEBUGの使用
NSLogはリソースを消費するので、プログラムを発行した後、NSLogを注釈する必要があります.
最初のテクニック:
プロジェクトの設定には、あらかじめ定義されたDEBUGがあります.デバッグ時にのみ1に割り当てられます.したがって,DebugモードのみでコンパイルされたNSLogを実現することができる.
高度なテクニック:
pchファイルに次のコードを追加して、デバッグ時にのみ出力を実行できます.
スケッチ法で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