我习惯于编程并且可以查看日志消息.我知道你曾经能够NSLog()
在调试Cocoa应用程序时用它来追踪消息.在iPhone Xcode开发环境中编码时,"跟踪"消息的最佳方法是什么?
在Xcode中跟踪日志消息有一种更方便的方法,那就是使用断点操作.
在您想要添加printf或NSLog的代码行上,设置断点,然后按住Control键并单击它并选择"编辑断点".在出现的蓝色气泡中,单击右侧的+按钮以打开断点操作: alt text http://idisk.mac.com/cdespinosa/Public/Breakpoint%20Actions.png
在那里输入您的日志文本.当@符号分隔时,可以使用可以在调试器中打印的任何表达式.
对于调试Objective-C,从弹出窗口中选择"Debugger Command"并输入'po [[object method] method]'来打印Objective-C对象的描述字符串或方法调用的结果通常更有用.
确保单击右上角的"继续"复选框,以便在日志后继续执行.
相比NSLog和printf的优点:
它在飞行中.您不必重新编译并重新启动即可添加或编辑日志消息.这为您节省了大量时间.
您可以有选择地启用和禁用它们.如果您从中学到了足够多,但它的喷射干扰,只需取消选中它的Enabled框即可.
所有输出都是在Mac上生成的,永远不会在iPhone上生成,所以您不必在事后下载和解析日志.
在您的应用程序中发送控制台喷出的可能性显着降低.
还可以看看Speak按钮; 它非常适合调试无法看到调试日志的全屏应用程序.
这是我在网上某处找到的大量代码.它定义了新函数DLog()和ALog().仅当使用-DDEBUG标志(定义DEBUG)编译应用程序时,才会显示DLog消息.始终显示ALog消息(即使在释放模式下).
// DLog is almost a drop-in replacement for NSLog // DLog(); // DLog(@"here"); // DLog(@"value: %d", x); // Unfortunately this doesn't work DLog(aStringVariable); you have to do this instead DLog(@"%@", aStringVariable); #ifdef DEBUG # define DLog(fmt, ...) NSLog((@"%s [Line %d] " fmt), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__); #else # define DLog(...) #endif // ALog always displays output regardless of the DEBUG setting #define ALog(fmt, ...) NSLog((@"%s [Line %d] " fmt), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__);
在我的项目中,我有一个基于DebugOutput.m的自定义解决方案.这会将文件和行号添加到调试输出中,从而更容易识别输出文本的来源,同时仍然保持简洁.
我使用调试掩码扩充了标准解决方案,以便我可以在我的应用程序中打开和关闭特定功能区域的调试.在Debug.h中,我有
typedef enum { kDebugMaskAp- = 1, kDebugMaskXMLParser = 1 << 1, kDebugMaskNetwork = 1 << 2, kDebugMaskAnalytics = 1 << 3, kDebugMaskCache = 1 << 4, } debugBitMask; #define debugForComponent(mask,format,...) if( currentDebugMask() & mask) [[DebugOutput sharedDebug] output:__FILE__ lineNumber:__LINE__ input:(format), ##__VA_ARGS__]
在Debug.m中
-(void)output:(char*)fileName lineNumber:(int)lineNumber input:(NSString*)input, ... { va_list argList; NSString *filePath, *formatStr; // Build the path string filePath = [[NSString alloc] initWithBytes:fileName length:strlen(fileName) encoding:NSUTF8StringEncoding]; // Process arguments, resulting in a format string va_start(argList, input); formatStr = [[NSString alloc] initWithFormat:input arguments:argList]; va_end(argList); // Call NSLog, prepending the filename and line number NSLog(@"File:%s Line:%d %@",[((DEBUG_SHOW_FULLPATH) ? filePath : [filePath lastPathComponent]) UTF8String], lineNumber, formatStr); [filePath release]; [formatStr release]; }
在应用程序中,调用看起来像这样:
debugForComponent(kDebugMaskApp,@"Request failed - error %@", [error localizedDescription]);