你用过的 NSLog 都有哪些独特的用途?

Posted

技术标签:

【中文标题】你用过的 NSLog 都有哪些独特的用途?【英文标题】:What are some unique uses of NSLog you have used?你用过的 NSLog 有哪些独特的用途? 【发布时间】:2009-05-23 12:42:50 【问题描述】:

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

【问题讨论】:

【参考方案1】:

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

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

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

#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...

【讨论】:

你可以用这个代替前 2 行,因为 Xcode 会在构建中自动为你定义 Release:#ifndef Release。我更喜欢它,因为它只是少了一个 #define =)【参考方案2】:

我使用一些带有 NSLog 的宏来快速调试 cocoa 的 NSPointNSSizeNSRect 结构体的内容:

#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

【讨论】:

仅供参考,对于大多数非对象类型已经有了方便的函数:NSStringFromRect、NSStringFromPoint、NSStringFromSize、NSStringFromRange 等,所以除非你需要控制可以简化#defines 的确切格式 谢谢您,先生。我以前从未听说过这些!【参考方案3】:
NSLog(@"%s", __func__);

打印当前方法签名或函数名。

【讨论】:

【参考方案4】:

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

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

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

【讨论】:

【参考方案5】:

这里有一个可以让您缩进调试日志的某些部分以使内容更具可读性:

// 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 步 再见,残酷的世界!

【讨论】:

以上是关于你用过的 NSLog 都有哪些独特的用途?的主要内容,如果未能解决你的问题,请参考以下文章

Visual Studio 都有哪些好用的插件

作为 Web 开发人员/经理,您发现 XMPP 都有哪些用途可以帮助您? [关闭]

你知道 JavaScript 中的 Arguments 对象都有哪些用途吗?

你用过哪些好用的开源软件?

你知道 JavaScript 中的 Arguments 对象都有哪些用途吗?

最流行的渗透测试工具,你用过哪些