目录

  • Xcode Debug 指南(一)– 当前
  • Xcode Debug 指南(二)
  • Xcode Debug 指南(三)
  • Xcode Debug 指南(四)


准备工作

首先,标准开局:打开 Xcode,新建一个项目。

随后,在 Main.storyboard 中拖入一个 Table View Controller,将「箭头」(Storyboard Entry Point)拖到它身上。

「初始化」 Storyboard

然后新建一个 UITableViewController 子类:

创建 Table view controller 子类

再回到 Storyboard,将控制器设置为 DemoTableViewController

设置 Controller 类型

选中一个 Cell,设置它的 Reuse Identifier 为 Cell:

设置 Reuse ID

以上均为基本操作,此处假定你已经懂得了。如果你还不会,你应该从更基础的地方学习。


断点(Breakpoint)

Table view controller 有一些生命周期方法,除此以外,它还负责给 table view 提供数据、响应它的事件等等:

方法们

这些个方法,大家都已经熟络了。但你知不知道它们被调用的先后顺序是怎样的?

通过设置断点,你就能清楚地知道这一切了:

设置断点

只要滑鼠在左边点一下,就能把断点设置上了。

这样,程序就会在断点位置暂停(当然,前提是 Xcode 必须和你的 App 保持连接):

命中断点

击中断点时,断点所在的那行代码就绿了,提示你当前的状态:线程 1 击中断点 1.1。

从左侧面板可以看到,你现在正位于线程 1,处在 DemoTableViewController 实例的 viewDidLoad() 方法中。

底部面板有一排工具栏。工具栏的下方左半边,显示了当前的所有变数;右半边有个神秘的 (lldb),它就是本系列文章的主角,但暂时先不提。

点击工具栏的继续按钮,程序就会继续运行:

继续运行

继续不久,程序又会再次击中下一个断点。击中,继续,击中,继续……

这样,你就知道这些方法分别是什么时候被调用的了。

最终的调用顺序是:

  1. viewDidLoad()
  2. viewWillAppear(_:)
  3. numberOfSections(in:)
  4. numberOfSections(in:)
  5. tableView(_:, numberOfRowsInSection:) -> Int
  6. viewWillLayoutSubviews()
  7. numberOfSections(in:)
  8. tableView(_:, numberOfRowsInSection:) -> Int
  9. tableView(_:, cellForRowAt:) -> UITableViewCell

  10. tableView(_:, heightForRowAt:) -> CGFloat
  11. tableView(_:, cellForRowAt:) -> UITableViewCell
  12. tableView(_:, heightForRowAt:) -> CGFloat
  13. viewDidLayoutSubviews()
  14. viewWillLayoutSubviews()
  15. viewDidLayoutSubviews()
  16. viewDidAppear(_:)
  17. viewWillLayoutSubviews()
  18. viewDidLayoutSubviews()

仔细看看,是不是和你脑海中的一样呢?


推荐阅读:
相关文章