上次我们聊完了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 图)。
通过下方工具栏,从左至右,我们可以:调节视图层级之间的距离远近|展示被裁减的内容、展示约束、改变视图模式、改变背景|选择 2D/3D 视图|缩放|调整可视视图的范围。
此外,右键某一个图层,选项如下图,点击Reveal in Debug Navigator,即可查看该图层在所有图层中的位置,方便捋清图层之间的嵌套关系。
总的来说,3D 视图层级检查非常适合检查 UI 问题。
好了,短暂的时光总是这么短暂,这期是不是非常简短又实用呢?尤其是断点的一些高级调试技巧。
👏希望对你有所帮助,欢迎留言交流!
下周再见#
我们再来瞅瞅《虾票票》App:
可以看到,除了 UI 界面,它还包含这些功能:拉取网络电影数据,下拉刷新,上拉加载更多,菊花 loading 交互等等。那么这些功能是不是很难实现哇?👀
也许它们是很难实现,但这并不重要,网上有很多开源的第三方库,它们已经实现了上述功能,我们只要会拉取它们并使用即可。
这也就是我们下周要聊的内容了:CocoaPods——iOS 开发的第三方库依赖管理工具。
🎺敬请期待。
——湖南降温太快了,回深圳避寒🚄
2021.10.9