当前位置:  开发笔记 > IOS > 正文

如何使用NSLog调试(@"iPhone模拟器内部")?

如何解决《如何使用NSLog调试(@"iPhone模拟器内部")?》经验,为你挑选了3个好方法。

我习惯于编程并且可以查看日志消息.我知道你曾经能够NSLog()在调试Cocoa应用程序时用它来追踪消息.在iPhone Xcode开发环境中编码时,"跟踪"消息的最佳方法是什么?



1> cdespinosa..:

在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按钮; 它非常适合调试无法看到调试日志的全屏应用程序.


在我看来,还有一个优势是最好的:当在一个团队中开发(使用SCM)时,我讨厌让我的控制台混乱其他开发人员的调试输出.使用您的方法,调试输出不会提交给源代码或项目,只能在创建它的本地计算机上看到.
我不明白如何使用它.请举例说明NSLog(@"x%f",myView.center.x);
给他一个民粹主义者!
我喜欢这个想法,我想我会不时地使用它.但我也看到了一个很大的劣势 - 擦拭太容易了,虽然有评论说看到其他开发者的日志记录是减号,但我认为恰恰相反.内置日志记录有一个巨大的优势,可以帮助您跟踪代码中的程序执行,并且不会通过删除所有断点或将代码提供给其他开发人员来消除.对于这种日志记录,定义是你的朋友.

2> Elliot..:

这是我在网上某处找到的大量代码.它定义了新函数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__);



3> Jane Sales..:

在我的项目中,我有一个基于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]);

推荐阅读
殉情放开那只小兔子
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有