我习惯于编程并且可以查看日志消息。我知道您曾经能够在调试Cocoa应用程序时使用NSLog()
来跟踪消息。在iPhone Xcode开发环境中编码时,“跟踪”消息的最佳方法是什么?
答案 0 :(得分:214)
在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:
还要查看Speak按钮;它非常适合调试无法看到调试日志的全屏应用程序。
答案 1 :(得分:9)
这是我在网上某处找到的大量代码。它定义了新函数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__);
答案 2 :(得分:5)
在我的项目中,我有一个基于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]);
答案 3 :(得分:2)
将其粘贴到前缀标题中。来自项目的所有日志肯定会消失。
#ifndef __OPTIMIZE__
# define NSLog(...) NSLog(__VA_ARGS__)
#else
# define NSLog(...) {}
#endif
答案 4 :(得分:0)
您可以使用NSLogger,这样可以为表格带来更多信息,而不仅仅是记录您的消息。我使用宏来禁用发布版本中的日志,同时让它们中的每一个都在调试版本中保持活动状态。日志卷不是问题,因为NSLogger提供了强大的日志过滤选项。
答案 5 :(得分:-2)
我只是使用替换所有功能....
我通过替换NSLog(@“和// *** NSLog(@”
)来禁用所有NSLog语句这样我就可以在// *** NSLog(@“并重新启用它们)
中找到它(在所有项目文件中使用find)没有什么花哨但它有效:)