iOS有多少种调法?每一种都超美味!(4)

郴州砍肉粉,是兄弟就来砍

上次我们聊完了iOS的常用UI组件,不知道你是否已经可以制作一些简单的UI界面了呢~

但是,在实践的过程中很难不遇到BUG,或者结果很难直接符合预期,这个时候我们就需要用到调试功能了!

接下来,让我们进入从《虾票票》带你入门iOS系列(4)——Xcode调试

⚠️:本节包含的调试技巧并不局限于iOS开发,应该大部分IDE中都包含这些功能。

甜:断点相关

添加断点

添加断点很简单,在代码对应行号处上单击即可;删除断点时,通过将断点标记拖出区域即可。

条件断点

右键断点-Edit Breakpoint,填写合适的Condition,则运行到断点处时,只有符合Condition时才触发断点,暂停⏸️代码运行。

条件断点

断点处自动执行任务

右键断点-Edit Breakpoint,添加Action,如 p cnt (调试命令类型),即在经过该断点时,打印 cnt 变量。

勾选下面的Options,即可在执行上述Action后继续运行代码,而不暂停。

断点处自动执行任务

断点忽略

右键断点-Edit Breakpoint,如红框所示,则会忽略第1次触发断点的情况,在第2次触发断点时才会暂停,一般用于忽略初始化的情况。

断点忽略

异常断点

在断点导航栏的左下方可以添加异常类型的断点。

当发生异常时,则不会导致Crash,而是在即将Crash处暂停,此时可以很清晰地查看调用堆栈(详见下一小节介绍),定位Crash根源

异常断点

符号断点

在断点导航栏的左下方可以添加符号类型的断点,设置Symbol为某种类型的方法,如 - [UIViewController viewDidLoad] ,即设置了该类方法的通用断点,而不需要在每个调用处添加断点。

符号断点

PS:参考Xcode高级调试技巧,你知道吗?——简书

酸:调用堆栈查看

进入断点时,有3种方式查看当前的调用堆栈。

断点导航栏

断点导航栏区域显示了所有线程以及每个线程中的方法调用堆栈,0代表栈顶方法,即当前方法,数字大的调用数字小的。

断点导航栏

PS:上图中省略的方法2~28调用的是iOS系统底层,因为iOS并不是开源的,所以看不到底层的调用堆栈。

下方工具栏

下方工具栏的项目名称处展示了与断点导航栏相同的效果。

下方工具栏

调试区域

调试区域可以通过输入 thread backtrace 命令,以文本方式展示当前调用堆栈。

调试区域

此外,还可以通过 thread info [i] 查看线程 i 的基本信息。

PS:参考iOS 打印函数调用栈,查看变量在何处调用——CSDN

辣:3D视图层级检查

在使用App时,点击下方工具栏的红框按钮,即可查看App当前界面(见下图左边模拟器)的3D视图层级(见下图右边3D图)。

3D视图层级检查

通过下方工具栏,从左至右,我们可以:调节视图层级之间的距离远近|展示被裁减的内容、展示约束、改变视图模式、改变背景|选择2D/3D视图|缩放|调整可视视图的范围。

视图工具栏

此外,右键某一个图层,选项如下图,点击Reveal in Debug Navigator,即可查看该图层在所有图层中的位置,方便捋清图层之间的嵌套关系。

总的来说,3D视图层级检查非常适合检查UI问题


好了,短暂的时光总是这么短暂,这期是不是非常简短又实用呢?尤其是断点的一些高级调试技巧。

👏希望对你有所帮助,欢迎留言交流!

下周再见

我们再来瞅瞅《虾票票》App:

虾票票V1.0

可以看到,除了UI界面,它还包含这些功能:拉取网络电影数据,下拉刷新,上拉加载更多,菊花loading交互等等。那么这些功能是不是很难实现哇?👀

也许它们是很难实现,但这并不重要,网上有很多开源的第三方库,它们已经实现了上述功能,我们只要会拉取它们并使用即可。


这也就是我们下周要聊的内容了:CocoaPods——iOS开发的第三方库依赖管理工具。

🎺敬请期待

——湖南降温太快了,回深圳避寒🚄

2021.10.9