你用过的 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 的 NSPoint
、NSSize
和 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
【讨论】:
仅供参考,对于大多数非对象类型已经有了方便的函数: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 都有哪些独特的用途?的主要内容,如果未能解决你的问题,请参考以下文章
作为 Web 开发人员/经理,您发现 XMPP 都有哪些用途可以帮助您? [关闭]
你知道 JavaScript 中的 Arguments 对象都有哪些用途吗?