0

デバッグに使用する NSLog の独自または特別な用途はありますか?

4

5 に答える 5

11

この形式をデバッグに使用するのが好きです。

NSLog( @"<%p %@:(%d)> %@", self, [[NSString stringWithUTF8String:__FILE__] lastPathComponent], __LINE__, [NSString stringWithFormat:(s), ##__VA_ARGS__] )

もちろん、使いやすくするために、これを独自のメソッドまたは関数にラップする必要があります。私はプリプロセッサを使用しており、自分で使用する場合と、ベータ テスターに​​送信する特別なビルドでのみ有効にしています。ちなみに、これはこの質問への私の回答からコピーされたものです。

#define DEBUG_MODE

#ifdef DEBUG_MODE
    #define DebugLog( s, ... ) NSLog( @"<%p %@:(%d)> %@", self, [[NSString stringWithUTF8String:__FILE__] lastPathComponent], __LINE__, [NSString stringWithFormat:(s), ##__VA_ARGS__] )
#else
    #define DebugLog( s, ... ) 
#endif

これは とDebugLog同じようNSLogに動作しますが、ファイル名とそれが呼び出された行番号を表示します:

2009-05-23 17:23:40.920 myproject[92523:10b] <AppCon.m:(8)> My debug message...
于 2009-05-23T15:32:46.127 に答える
4

NSLog でいくつかのマクロを使用して、cocoa のNSPointNSSize、およびNSRect構造体の内容をすばやくデバッグします。

#define LogPoint(POINT) CMLog(@"%s: (%0.0f, %0.0f)",\
                              #POINT, POINT.x, POINT.y)

#define LogSize(SIZE) CMLog(@"%s: %0.0f x %0.0f",\
                            #SIZE, SIZE.width, SIZE.height)

#define LogRect(RECT) CMLog(@"%s: (%0.0f, %0.0f) %0.0f x %0.0f",\
                            #RECT, RECT.origin.x, RECT.origin.y,\
                            RECT.size.width, RECT.size.height)

これらは次のように使用できます。

LogPoint(somePoint);
LogSize(someSize);
LogRect(someRect);

そして、次の出力が生成されます。

somePoint: (100, 200)
someSize: 12 x 440
someRect: (120, 240) 326 x 74
于 2009-05-23T18:07:47.743 に答える
3
NSLog(@"%s", __func__);

現在のメソッド シグネチャまたは関数名を出力します。

于 2009-05-23T18:14:49.027 に答える
2

以下は、デバッグ ログの一部をインデントして読みやすくするものです。

// MyDebugStuff.h:
void MyLog_Indent();
void MyLog_Outdent();
void MyLog(NSString * format, ...);

// MyDebugStuff.m:
int logIndentLevel = 0;

void MyLog_Indent()  { logIndentLevel++; }
void MyLog_Outdent() { if (logIndentLevel > 0) { logIndentLevel--; } }

void MyLog(NSString * format, ...)
{
    va_list args;
    va_start(args, format);

    NSString * indentString = [[NSString stringWithString:@""]
                     stringByPaddingToLength:(2*LogIndentLevel)
                                  withString:@" "
                             startingAtIndex:0];

    NSLogv([NSString stringWithFormat:@"%@%@", indentString, format], args);

    va_end(args);
}

これは次のように使用できます。

MyLog(@"Hello, world");
MyLog_Indent();
MyLog(@"Step 1");
MyLog(@"Step 2");
MyLog_Indent();
MyLog(@"Step 2a");
MyLog(@"Step 2b");
MyLog_Outdent();
MyLog(@"Step 3");
MyLog_Outdent();
MyLog(@"Goodbye, cruel world!");

そして生成します:

こんにちは世界
  ステップ1
  ステップ2
    ステップ 2a
    ステップ 2b
  ステップ 3
さようなら残酷な世界!
于 2009-05-23T18:25:50.507 に答える
2

これは NSLog の機能ではありませんが、NSLog で使用すると非常に便利です: オブジェクトに %@ プレースホルダーを使用すると、それらの説明が表示されます:

NSLog (@"The object is %@", someKindOfObjectWhichYouWantToDisplay);

このようにして、たとえば、返されたオブジェクトをすばやく確認できます。これは、「説明」セレクターをオブジェクトに送信することで機能します。これはもちろん、独自のオブジェクトに実装できます。

于 2009-05-23T18:15:00.587 に答える