0

您用于调试的 NSLog 有什么独特或特殊的用途吗?

4

5 回答 5

11

我喜欢使用这种格式进行调试。

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

当然,您需要将其包装在您自己的方法或函数中以方便使用。我使用预处理器,并且只为我自己的使用和我发送给 beta 测试人员的特殊版本启用它。顺便说一句,这是从我对这个问题的回答中复制而来的。

#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 的NSPointNSSizeNSRectstruct 的内容:

#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

这不是 NSLog 的特性,但是它与 NSLog 一起使用非常方便:您可以使用 %@ 占位符来表示对象,并且将显示它们的描述:

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

例如,通过这种方式,您可以快速查看返回的对象。这通过向“描述”选择器发送一个对象来工作,当然,它可以在您自己的对象中实现。

于 2009-05-23T18:15:00.587 回答
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 回答