xcode 代码调试与快捷键 代码块

为何你的数组包含3个项目而不是5个?为何你的游戏运行缓慢?这些都跟调试有关,调试是开发过程当中必不可少的一部分。本文所列举了一些重要的调试功能(固然并不全面)能够帮你用更少的时间来解决bug问题。html

 
本文内容主要包括3个方面:
使用console检查app状态
进行日志记录,并熟练的驾驭NSLog
使用对象的生命周期来跟踪内存的使用。
 
使用Console检查app状态
Xcode底部的小黑盒是咱们调试时的好朋友,它能够输出日志信息、错误信息以及其余有用的东西来帮你跟踪错误,除了能够看到日志直接输出的信息外,咱们编程过程当中也能够在某些断点停留,来检查app的多个方面。
 
条件断点
我假定你知道Breakpoints是如何工做的(若是你不知道,呵呵,看完这个文章也许你就知道了!)
 
让程序在某个特定的时间点命中断点很是有价值,但要经过一个循环或者递归函数才能让对象等于某个肯定的值,是一件使人痛苦的事情。这时候咱们可使用条件断点!
 
条件断点就是带有条件表达式的断点,只有知足这个条件,程序才会暂停。假想咱们只想在对象处于特定状态的时候断点,或者在第N次迭代循环时命中断点。
 
点击Xcode editor的‘gutter’来添加断点,右键点击断点,而后选择“edit breakpoint”来设置特定条件。
 
 
条件断点只有在遇到特定状况时才会中断,你能够提供给一个条件(好比i == 12),或者断点应该忽略的次数。另外,你还能够添加能根据断点自动发生的动做,例如一个debugger command---打印一个值。
 
提示:添加/删除断点的键盘快捷键是command+\
 
另一个重要的断点技巧是添加一个异常断点(exception breakpoint)。当遇到异常时, Xcode基本上都会自动转到main方法的autorelease pool中。
 
经过设置异常断点,你能够定位到引发异常断点的具体代码行。
 
如何添加异常断点?
 
1.打开异常断点tab(command+6);2.选择窗口左下角的”+”按钮;3.选择按钮并添加‘exception breakpoint’。
 
这样,当Xcode遇到异常状况时,将会在引发异常代码的地方发生断点。
 
从Console进行手动打印
理论上说,它会展现当前环境中全部值的状态;实际上,有时候会出现bug,而且不会列出值或者当你单步调试的时候不进行更新。
 
通常状况下,咱们在app代码中添加特定断点,是为了经过Xcode提供的‘variables view’(该view在Xcode底部console旁边)来查看对象的状态 。理论上说,它能够显示出与当前上下文相关的全部值的状态。实际上,有时候会有点小问题,不会列出相关的值或者不会进行相关的更新。
 
不过,咱们可使用一些有用的console命令来检查特定的对象。在console中输入‘po’就能够得到某个断点的即时信息。(处理scalar值时,咱们可使用‘p’)
 
在咱们查看一个已存在的对象时,这一点很是有用(若是对象不存在的话会打印出nil),肯定对象的值,找出数组/字典运行时的信息,甚至是比较两个对象。由于这个指令打印出相关对象的内存地址,因此你能够打印你认为应该同样的两个对象,看看它们的内存地址是否相同。
另外一个有用的,可是被隐藏的指令是recursiveDescription,你能够简单地用它对view进行检查。
在view中调用recursiveDescription来打印它的继承关系。
 
 
有效的Logging
有时,在调试程序的某个特定时间,咱们但愿将消息打印到控制台,此时‘NSLog’函数容许咱们将任意输出打印至console。
 
此时可使用NSLog函数,经过该函数能够将任意的输出打印到控制台。在不使用断点时,这个功能很是有用。NSLog听从的格式与[NSString StringWithFormat]方法听从的格式同样。(你能够从下边的截图中看到)
 
 Tip: 这里能够看到苹果关于Objective-C中字符串格式化的信息:  String Programming Guide
 
NSLog 
NSLog很是有用,咱们须要聪明地实现它。从NSLog打印出的任何东西都会变成代码,任何人均可以看见。将设备链接到电脑,打开XCode中的organiser,就能够从console查看到每条日志信息,这会带来很大的影响。想一下,你想把一些保密的算法逻辑或者用户密码打印到console。正由于这个,若是苹果发如今production build中,有太多内容输出到console,那么你的应用可能会遭到苹果的拒绝。
 
 
幸运的是,这里有一个最简单的办法进行log——经过一个宏,让NSLog只在debug build的时候起做用。将这个功能添加到全局都能访问获得的头文件中。这样你就能够尽情的使用log了,而且当进行production时,不会包含log相关代码。以下代码:
 
1.#ifdef DEBUG
2.#define DMLog(...) NSLog(@"%s %@", __PRETTY_FUNCTION__, [NSString stringWithFormat:__VA_ARGS__])
3.#else
4.#define DMLog(...) do { } while (0)
 
若是你使用DMLog,那么它只能在debug build期间打印。__PRETTY_FUNCTION__ 也能够帮忙打印出log所在的函数的名称。
 
下一步
NSLog 很强大,但也有很多限制:
1. 只能本地打印
2. 不支持分级别的log(好比是危险仍是警告)
3. NSLog很是慢,大量处理时会明显下降程序的运行效率。
 
推荐两个框架,能够避免NSLog一些限制:
Cocoa LumberJack –众所周知的通用的Cocoa日志框架之一,学习起来有点难度,可是很是强大。
SNLog –NSLog的替代品。
 
跟踪对象的生命周期
尽管Automatic Reference Counting (ARC)已经让内存管理变得简单、省时和高效,可是在object的life-cycles中跟踪一些重要事件依然十分重要。毕竟ARC并无彻底排除内存泄露的可能性,或者试图访问一个被release的对象。为了这个目的,咱们能够用一些处理方法和工具来帮助咱们盯着对象正在作些什么。
 
LOG重要事件
Objective-C 对象的 life-cycle中有两个很重要的方法: init 和dealloc ,将这两个方法调用的事件log到console是不错的选择——你能够经过控制台观察到对象生命的开始,更重要的是,能够确保对象的释放。
1.- (id)init
2.{
3.    self = [super init];
4.    if (self)
5.    {
6.        NSLog(@"%@: %@", NSStringFromSelector(_cmd), self);
7.    }
8.    return self;
9.}
10.- (void)dealloc
11.{
12.    NSLog(@"%@: %@", NSStringFromSelector(_cmd), self);
13.}
 
 
静态分析器和Inspector(检查器)
Xcode中还有两个工具能够帮咱们清理代码,减小代码出错的概率。对Xcode而言,静态分析器工具是一个很是棒用来改善代码的工具。好比检测出没有使用过的对象,没有release对象(针对Core Foundation对象,ARC仍然会有这样的问题)。经过选择Product菜单中的‘Anlayze’能够查看到相关建议。
 
 
检查器是很是强大的一组工具,经过检查器不只能够从不一样的角度检查程序对内存的使用状况,文件系统的使用状况(增长、删除、修改等),甚至还提供了自动UI交互的方法。经过选择Product菜单中的‘Profile’能够查看到这些检查器。
选择‘Profile’会打开一个Instrument窗口,这里能够选择一个配置模板进行运行。最经常使用的模板有zombies(稍后会讨论),activity monitor和leaks。在程序运行时,对内存泄露进行捕捉时,Leaks多是最有用的一个模板。
 
  Zombies是你的朋友
虽然在有ARC的地方很难再遇到让人难受的EXC_BAD_ACCESS错误了,可是在某些肯定的状况下,该错误仍是会发生的。当在处理UIPopoverController或者core foundation对象时,咱们能够访问一个已经被release掉的对象。通常,当咱们release内存中的一个对象时,该对象将被销毁。可是,当Zombies开启时,只是将对象标记为release,实际上该对象还停留在内存中。当咱们访问一个Zombie对象时,Xcode能够告诉咱们正在访问的对象是一个不该该存在的对象了。由于Xcode知道这个对象是什么,因此可让咱们知道这个对象在哪里,以及这是何时发生的。
 
这里有两种方法能够查找出Zombies对象。使用检查器中的Zombie配置模板,或者在‘Run’ build选项中开启Zombie诊断选项。在Stop按钮的旁边,点击scheme名称,而后选择‘Edit Scheme’,点击diagnostic tab项,并勾选上‘Enable Zombie Objects’。注意,Zombie只能用在模拟器调试中,真机上不能使用。
 
注意,Zombie模式调试仅适用于模拟器,不能在真实设备上使用。
 
 
总结
但愿以上内容能给你帮你更高效地调试你的app,全部这些都是为了能都节省bug修复时间,这样开发者就能把时间花在更重要的事情上,或者打造一款伟大的应用程序。
 
上边列出的确定不是一个全面的列表,还有不少咱们没有讨论的方法,好比远程遥控bug报告,崩溃报告以及更多。也但愿你能分享更多。
 
 
xcode默认快捷键
 

Run->Run(Command+R)
Run->Go、Run->Debug(Command+Y)git

command+Z+P 继续(调试器中)github

command+Z+O 跳过算法

command+Z+I 跳入编程

command+Z+T 跳出数组

自定义:xcode

选择Xcode->Preferences->Key Bindings 调试位F5-F9
相关文章
相关标签/搜索