南京iOS开发培训分享iOS开发调试技巧总结
对于软件开发而言,调试是必须学会的技能,重要性不言而喻。对于调试的技能,基本上是可以迁移的,也就是说你以前在其他平台上掌握的很多调试技巧,很多也是可以用在iOS开发中。不同语言、不同IDE、不同平台的调试,有同性也有个性。南京iOS开发培训和大家分享一下iOS开发中的调试技巧,语言暂用为OC,IDE当然是强大的Xcode。首先说明下,Xcode已经为我们调试项目提供了极大的方便。【1.普通断点】
断点(Breakpoint)绝对是调试程序的第一大选择,也是掌握的基础技能。顾名思义,当程序运行到断点处时会暂停运行。比如断点打在11行,那么程序就会停在11行(注意:程序只运行到了前10行,第11行其实还没有被执行!!!)。只要在代码行旁边点击,就能添加一个断点,再次点击,就能让断点不可用(disable了,仍然存在,只是不起作用了)。在某一行创建断点的快捷键是:command+
http://mmbiz.qpic.cn/mmbiz/k0UVxv3BTLLffKLm5CGzWKaSgF19X5BEgNKVWaHwk3nv8V56iaRSyCJ2XVXkBrD0xtX7sWYbib9tRgfqjNUID5ew/0?wx_fmt=png
http://mmbiz.qpic.cn/mmbiz/k0UVxv3BTLLffKLm5CGzWKaSgF19X5BEnPbrVehfib2BgqYxkibtia5ib3f6Ye42V0RCJCibLZdvcPnMOrC3bR808ibA/0?wx_fmt=png
并能在调试过程中在下方看到参数的值:
http://mmbiz.qpic.cn/mmbiz/k0UVxv3BTLLffKLm5CGzWKaSgF19X5BEl8fZL7b7fZq7BaKXe35PqN8APDHAywmGicHzphax0vjpibB76teJcdWQ/0?wx_fmt=png【2.条件断点】
以上的断点只是最普通的,我们还能对断点的属性进行配置,设置条件,使断点更加智能化,右键断点进入编辑对话框:
http://mmbiz.qpic.cn/mmbiz/k0UVxv3BTLLffKLm5CGzWKaSgF19X5BEtLPicgduSwD92ib7wc64XN6xuKEpyhs6L34Z2j85OFDWJKZbWQbqOoqw/0?wx_fmt=png
我以一个循环作为测试代码:
http://mmbiz.qpic.cn/mmbiz/k0UVxv3BTLLffKLm5CGzWKaSgF19X5BE98OKNVuapFWOF9ibXcicfa1xLgnTkzfiaZTPIdQB9Dk7FiaterWUf57zSg/0?wx_fmt=png
循环中的代码每次都要单步执行,可能这并不是我想要的。我想要在i为3的时候中断程序,进行调试,编写条件如下:
http://mmbiz.qpic.cn/mmbiz/k0UVxv3BTLLffKLm5CGzWKaSgF19X5BE4o3OqdficXBuONVYiaJ8Dh4mxZHor3iaia2hFfnSzlMiaKNlDX7sRdKeLwQ/0?wx_fmt=png
设置i==3的条件后,程序就会在该条件时中断,而不会每次到达该位置都中断。中断时输出如下: 南京iOS开发培训
http://mmbiz.qpic.cn/mmbiz/k0UVxv3BTLLffKLm5CGzWKaSgF19X5BEntajyT1XrEH7FO6UDrqnftIrPicIzmYMyhS9RJ7ke3z750n9fIfUKMA/0?wx_fmt=png
同时也可以设置Ignore参数,会忽略前面n次的断点运行,会在第n+1次中断。
http://mmbiz.qpic.cn/mmbiz/k0UVxv3BTLLffKLm5CGzWKaSgF19X5BEVvQqz2OFUsZBJRDLDrwd3ZtzcBXVg5iaX50RjSO3U5TYB3WichwnH9Dw/0?wx_fmt=png
调试输出如下: 南京iOS开发培训
http://mmbiz.qpic.cn/mmbiz/k0UVxv3BTLLffKLm5CGzWKaSgF19X5BEh3XwbdEI8a68jIAElX0SEkiblNafGUKicS0fUiaWrCqhAs7Zfx1DOYpOg/0?wx_fmt=png同时,还可以查看某个函数被调用的次数,设置Action参数如下,注意要选中Automatically continue after evaluating actions.
http://mmbiz.qpic.cn/mmbiz/k0UVxv3BTLLffKLm5CGzWKaSgF19X5BEycmdW73pTvUbJAbvY4ib4yoge4DkiaA72IRmB6JaKRgIMcv9QibbFDzVQ/0?wx_fmt=png
输出结果如下: 南京iOS开发培训
http://mmbiz.qpic.cn/mmbiz/k0UVxv3BTLLffKLm5CGzWKaSgF19X5BENUuicYFuEymGEVQr4a3r2KibaW4dibC25Hg4nkAIvJU4W8aeqM3ztdoyQ/0?wx_fmt=png
【3.异常断点】
断点的功能不限于上面所述。开发iOS知道,如果我们因为异常然后程序crash了,代码就直接跑到main.m的main函数中去了。为什么就不能跑到出现异常的代码中呢???异常断点就为我们解决该问题,程序就会在异常出现的那行代码终止。创建异常断点图例如下:
http://mmbiz.qpic.cn/mmbiz/k0UVxv3BTLLffKLm5CGzWKaSgF19X5BEV44GJ8SCDf6LXRDoVsIlar9jMDqvvibFPXy5IXUzQxWicibl14FW5l33w/0?wx_fmt=png
如下所示就创建完成了。如果碰到异常crash时,尝试使用异常断点吧。 南京iOS开发培训
【4.符号断点Symbolic Breakpoint】
符号断点的创建也同异常断点。一般符号断点可以在你指定的[类名 方法名]时中断执行。
http://mmbiz.qpic.cn/mmbiz/k0UVxv3BTLLffKLm5CGzWKaSgF19X5BEhMVb2NQnO9hvOafvJcA2BOkD8JdhGHs4fIrmOSIOtkS43WkT8jlj0A/0?wx_fmt=png
配置符号断点如下:可以当执行到ViewController类的viewDidLoad方法时中断执行。
http://mmbiz.qpic.cn/mmbiz/k0UVxv3BTLLffKLm5CGzWKaSgF19X5BEtbshGXImTg2wibwFxnkYV0IBq0bJJz8pj0XmFz85j3vEH92L0JrTyOg/0?wx_fmt=png
如果你的Symbol只写了一个函数名,那么就会在出现该函数名的地方就中断执行。如下,就会在运行到doAnimation的时候中断。是不是很强大呢?
http://mmbiz.qpic.cn/mmbiz/k0UVxv3BTLLffKLm5CGzWKaSgF19X5BEicjnOSbuN6R8BmU2BQnsdw07vYaDKZGLw1M5QrTicMCPn52tgVBh9FUw/0?wx_fmt=png
【5.Analyze分析器】
Analyze分析器是一种静态的工具,可以对我们的程序进行分析,找出我们未使用的变量,或一些死存储。执行Analyze如下:Product–>Analyze. 如下蓝色的标记就是静态分析的结果。
http://mmbiz.qpic.cn/mmbiz/k0UVxv3BTLLffKLm5CGzWKaSgF19X5BEuaR5R13jkOfKZHicImtRgLWJyqt6JFj01QjvZ1l70fHdJfhvPBNaNug/0?wx_fmt=png
当然,我们可以设置在编译程序的时候同时Analyze,把下列选项设为Yes即可。
http://mmbiz.qpic.cn/mmbiz/k0UVxv3BTLLffKLm5CGzWKaSgF19X5BEg8ZnfHvdibTRVicJdh2Ttib7Qt4DBmn6gceCqulW41iaibjiaQ6bmuzQMdicw/0?wx_fmt=png
【6.Profile检查器】
这个工具实在是太NB了,三言两语说不完,贴张图,大家感受一下,我会在以后的博客中慢慢讲解该工具的使用。同样在Product–>Profile中打开。
http://mmbiz.qpic.cn/mmbiz/k0UVxv3BTLLffKLm5CGzWKaSgF19X5BEkmpmeaBoDIn9CC3QlxLicWzfo6Nfy4gfEibyXQ4eKHibx2FwO4UJKNxDg/0?wx_fmt=png
【7.僵尸对象】
iOS中把那些已经release但还没完全消失的对象叫做僵尸对象,对已经release的对象再次释放,就会发生异常。虽然自从使用ARC后,由于对象释放产生的异常已经大大变少,但偶尔还会出现。开启僵尸对象模式后,就能快速定位到异常位置。开启方式如下:Product–>Scheme–>Edit Scheme. 勾选Enable Zombie Objects即可。
http://mmbiz.qpic.cn/mmbiz/k0UVxv3BTLLffKLm5CGzWKaSgF19X5BEAOfsVBQvStNLZXibG84py2qsZEmhR1X79JaibBR0KtScnaYbcpXqFXDQ/0?wx_fmt=png
【8.lldb命令】
Xcode中使用llvm编译器,公认为最好的C、C++、OC、Swift编译器。而lldb是llvm中的调试器,我们可以使用一些简单的命令进行调试,我还是把上面的循环代码作为测试代码。
http://mmbiz.qpic.cn/mmbiz/k0UVxv3BTLLffKLm5CGzWKaSgF19X5BExWOryDy3cYm5uibL7zP8iapdOqs9ROMRgAnn3ncsd40r0ibfFE6mmJMaQ/0?wx_fmt=png
断点调试中,使用po命令、print命令在Console控制台打印出变量信息:
http://mmbiz.qpic.cn/mmbiz/k0UVxv3BTLLffKLm5CGzWKaSgF19X5BEfeDk2oyRTRN3LNiahobZ0xZ6WcskTgk2wribibGw2BPAWamHJ2tbuZ2dw/0?wx_fmt=png【9.NSLog打印】
应该说NSLog打印信息是初学者最喜欢的调试手法,也是最简单的调试,通过打印出的信息查看程序运行的路径。但是打印出的信息较少,本身NSLog效率较低,有人使用宏做了部分优化,代码如下:能够打印出所在类名、所在方法名、详细时间、行号。
#import "ViewController.h" #define NSLog(format, ...) do { fprintf(stderr, "<%s : %d> %sn", [[ lastPathComponent] UTF8String], __LINE__, __func__); (NSLog)((format), ##__VA_ARGS__); fprintf(stderr, "-------n"); } while (0) @interface ViewController () @End @implementation ViewController - (void)viewDidLoad { ; for (int i = 0; i < 5; i++) { NSLog(@"我的值:%d",i); }} @end
打印结果如下:
http://mmbiz.qpic.cn/mmbiz/k0UVxv3BTLLffKLm5CGzWKaSgF19X5BEoNrjswTjTJNTJH7G4cC0aDvEwKj7HmnZ3PicV52bWaoDQKrTzLxPicDQ/0?wx_fmt=png
【10.生命周期方法init,dealloc】 南京iOS开发培训
对于ViewController来说,有两个生命周期函数我们可以进行重写,也就是init和dealloc方法。对于某些对象的状态,我们可以在这两个方法中查看。尤其是在dealloc中可以看到当ViewController退出的时候某个对象是否release。
- (instancetype)init{ self = ; if (self) { //初始化语句; } return self;} - (void)dealloc{ //释放后调用;}
【11.查看代码运行时间】 南京iOS开发培训
有时候我们想要准确的知道某段代码、某个循环执行的时间,然后分析效率等问题,这个时候就需要执行时间是多少。正好看到网上已经有人做了这个工作,我就直接摘下来了。正好也用了宏的方式计算时间,我们只要在需要计算时间的代码块前后写上TICK,TOCK宏即可。当然,原理也是非常的简单,也就是使用NSDate计算差值。
#import "ViewController.h" #define TICK NSDate *startTime = #define TOCK NSLog(@"Time: %f", -) @interface ViewController () @end @implementation ViewController - (void)viewDidLoad { ; TICK; for (int i = 0; i < 5; i++) { NSLog(@"我的值:%d",i); } TOCK;} @end
打印结果如下:
http://mmbiz.qpic.cn/mmbiz/k0UVxv3BTLLffKLm5CGzWKaSgF19X5BE5yn01rFj7ZkXgZoSBHicyvAibNeJ4sibj4mSNLicwFwiaaSKvWfvn04sFPg/0?wx_fmt=png
【12.手机截屏】
手机截屏也算调试?哈哈。其实也算是开发中的一个小技巧哈。其实大家都会在iPhone上同时按电源键+Home键截屏,然后使用各种通讯软件发给其他人,这个略显不方便。我们来使用Xcode中的方式截屏。当手机接上电脑后,注意要把调试设备选为自己的手机:http://mmbiz.qpic.cn/mmbiz/k0UVxv3BTLLffKLm5CGzWKaSgF19X5BEibflOyjfXUgW2ZfvJR8WuSibcem25pZoBsxSlqIcMYAk9jhqD69zPnJA/0?wx_fmt=png
然后选择Debug–>View Debugging–>Take Screenshot… .然后可以看到手机屏幕已经在你的电脑桌面了。是不是比直接在手机上操作方便多了呢?这样就可以快速的发给其他开发者、PM等人了。
【13.viewDidLoad不建议写太多代码】 南京iOS开发培训
江苏万和iOS培训建议不要在viewDidLoad方法中写入太多代码。尤其是涉及该界面中的动画的时候,因为执行viewDidLoad方法的时候,界面可能还没完全加载出来,如果此时把动画放在viewDidLoad中,可能会造成动画无法显示。当然也不建议把耗时的网络请求和动画效果都放在viewDidLoad中,界面的阻塞也会造成动画无法显示。可以尝试把动画放在viewDidAppear,viewWillAppear方法中。对于这类涉及UI的问题,调试也是比较麻烦的。。。
【14.视图调试】
如今iOS开发的UI设计有很多种方式,比如storyboard,xib,代码实现。对于stoayboard,xib可视化实现是比较简单的,但是对于一些“iOS老程序员”而言,都喜欢使用代码实现UI,并且可能UI层次还比较复杂。这样就给我们新接手项目的开发者带来很多困扰。如何快速查看一个复杂UI的界面层次和布局,最快的方法就是用到视图调试。
当项目运行到某一个界面(可以是模拟器或真机)时,开启视图调试,点击按钮如图:
http://mmbiz.qpic.cn/mmbiz/k0UVxv3BTLLffKLm5CGzWKaSgF19X5BEzt85K9SzPbrdBo3fRJP3oWtazAQVediaVqM0XT2UNSekkRC05l230wg/0?wx_fmt=png这样就会进入试图调试,你可以很方便的查看这个界面。这里可以看到控件之间的层次关系。
http://mmbiz.qpic.cn/mmbiz/k0UVxv3BTLLffKLm5CGzWKaSgF19X5BElM4xh56WUsPicR4yQ41XkTwQOlwicS3y7MfXAdaQyJX6gR89ic6WM4ghg/0?wx_fmt=png
左侧的树形层次图可以在查看线程、队列和UI之间切换:http://mmbiz.qpic.cn/mmbiz/k0UVxv3BTLLffKLm5CGzWKaSgF19X5BEiczTicvRfWyHqA4CgywsyS9V6QpyRrpXC2cl2xtiaKbsrmjMeSfeichwnA/0?wx_fmt=pnghttp://mmbiz.qpic.cn/mmbiz/k0UVxv3BTLLffKLm5CGzWKaSgF19X5BEwAooeQqNKEib7pIz52OricjiaiaINfs2tOtJswAoZCCVicr3dNPnL8EJMkg/0?wx_fmt=png
总结,南京iOS开发培训讲师提醒大家:调试不仅仅是上面提到的技巧,更多的是长年累月积累下来的经验,只有在自己的开发中不断的出错、试错、调错、解决错误的过程中才能提高自己的编程水平和调试能力。后续会继续更新,讲解更多的调试技能,希望大家都能在实践中提高进步。
页:
[1]