IOS开发调试技巧

Posted 「违规用户」

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了IOS开发调试技巧相关的知识,希望对你有一定的参考价值。

http://www.cocoachina.com/ios/20160321/15726.html

对于软件开发而言,调试是必须学会的技能,重要性不言而喻。对于调试的技能,基本上是可以迁移的,也就是说你以前在其他平台上掌握的很多调试技巧,很多也是可以用在iOS开发中。不同语言、不同IDE、不同平台的调试,有同性也有个性。今天我们就来学习一下iOS开发中的调试技巧,语言暂用为OC,IDE当然是强大的Xcode。首先说明下,Xcode已经为我们调试项目提供了极大的方便。

【1.普通断点】

断点(Breakpoint)绝对是调试程序的第一大选择,也是掌握的基础技能。顾名思义,当程序运行到断点处时会暂停运行。比如断点打在11行,那么程序就会停在11行(注意:程序只运行到了前10行,第11行其实还没有被执行!!!)。只要在代码行旁边点击,就能添加一个断点,再次点击,就能让断点不可用(disable了,仍然存在,只是不起作用了)。在某一行创建断点的快捷键是:command+\\

并能在调试过程中在下方看到参数的值:

【2.条件断点】

以上的断点只是最普通的,我们还能对断点的属性进行配置,设置条件,使断点更加智能化,右键断点进入编辑对话框:

我以一个循环作为测试代码:

循环中的代码每次都要单步执行,可能这并不是我想要的。我想要在i为3的时候中断程序,进行调试,编写条件如下:

设置i==3的条件后,程序就会在该条件时中断,而不会每次到达该位置都中断。中断时输出如下:

同时也可以设置Ignore参数,会忽略前面n次的断点运行,会在第n+1次中断。

调试输出如下:

同时,还可以查看某个函数被调用的次数,设置Action参数如下,注意要选中Automatically continue after evaluating actions.

输出结果如下:

【3.异常断点】

断点的功能不限于上面所述。开发iOS知道,如果我们因为异常然后程序crash了,代码就直接跑到main.m的main函数中去了。为什么就不能跑到出现异常的代码中呢???异常断点就为我们解决该问题,程序就会在异常出现的那行代码终止。创建异常断点图例如下:

如下所示就创建完成了。如果碰到异常crash时,尝试使用异常断点吧。

【4.符号断点Symbolic Breakpoint】

符号断点的创建也同异常断点。一般符号断点可以在你指定的[类名 方法名]时中断执行。

配置符号断点如下:可以当执行到ViewController类的viewDidLoad方法时中断执行。

如果你的Symbol只写了一个函数名,那么就会在出现该函数名的地方就中断执行。如下,就会在运行到doAnimation的时候中断。是不是很强大呢?

【5.Analyze分析器】

Analyze分析器是一种静态的工具,可以对我们的程序进行分析,找出我们未使用的变量,或一些死存储。执行Analyze如下:Product-->Analyze. 如下蓝色的标记就是静态分析的结果。

当然,我们可以设置在编译程序的时候同时Analyze,把下列选项设为Yes即可。

【6.Profile检查器】

这个工具实在是太NB了,三言两语说不完,贴张图,大家感受一下,我会在以后的博客中慢慢讲解该工具的使用。同样在Product-->Profile中打开。

【7.僵尸对象】

iOS中把那些已经release但还没完全消失的对象叫做僵尸对象,对已经release的对象再次释放,就会发生异常。虽然自从使用ARC后,由于对象释放产生的异常已经大大变少,但偶尔还会出现。开启僵尸对象模式后,就能快速定位到异常位置。开启方式如下:Product-->Scheme-->Edit Scheme. 勾选Enable Zombie Objects即可。

【8.lldb命令】

Xcode中使用llvm编译器,公认为最好的C、C++、OC、Swift编译器。而lldb是llvm中的调试器,我们可以使用一些简单的命令进行调试,我还是把上面的循环代码作为测试代码。

断点调试中,使用po命令、print命令在Console控制台打印出变量信息:

【9.NSLog打印】

应该说NSLog打印信息是初学者最喜欢的调试手法,也是最简单的调试,通过打印出的信息查看程序运行的路径。但是打印出的信息较少,本身NSLog效率较低,有人使用宏做了部分优化,代码如下:能够打印出所在类名、所在方法名、详细时间、行号。

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 #import "ViewController.h"       #define NSLog(format, ...) do  \\   fprintf(stderr,  " %s\\n" , \\   [[[NSString stringWithUTF8String:__FILE__] lastPathComponent] UTF8String], \\   __LINE__, __func__); \\   (NSLog)((format),  ##__VA_ARGS__); \\   fprintf(stderr,  "-------\\n" ); \\     while  (0)       @interface ViewController ()      @end       @implementation ViewController       - (void)viewDidLoad             [ super  viewDidLoad];        for  (int i = 0; i < 5; i++)             NSLog(@ "我的值:%d" ,i);                  @end

打印结果如下:

【10.生命周期方法init,dealloc】

对于ViewController来说,有两个生命周期函数我们可以进行重写,也就是init和dealloc方法。对于某些对象的状态,我们可以在这两个方法中查看。尤其是在dealloc中可以看到当ViewController退出的时候某个对象是否release。

1 2 3 4 5 6 7 8 9 10 11 12 13 - (instancetype)init           self = [ super  init];        if  iOS开发断点调试高级技巧

iOS开发调试技巧总结(持续更新中)

IOS开发调试技巧

iOS开发之Xcode常用调试技巧总结

iOS 开发调试技巧总结

iOS崩溃调试的使用和技巧总结

(c)2006-2024 SYSTEM All Rights Reserved IT常识