如何使用 Xcode 13+ 新的列断点(Column Breakpoints)让中断位置更加精确制导
Posted 大熊猫侯佩
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用 Xcode 13+ 新的列断点(Column Breakpoints)让中断位置更加精确制导相关的知识,希望对你有一定的参考价值。
概览
Xcode 13 之前,我们在调试链式调用或多重闭包中的表达式时,总是无法在希望的位置插入断点。
如果小伙伴们不太明白我的意思,请看如下示例:
如上图所示,在对应行下断点只会中断在该行第一个表达式上,而无法中断更深层的表达式。我们只有不停地 step in/out 才可以勉强达到目的。
上面只是非常简单例子,在实际App复杂代码的调试中,我们绝不希望这样浪费时间。
幸运的是,从 Xcode 13 开始,Apple 为我们提供了新的列断点(Column Breakpoints)机制,让我们可以在代码行的任意位置放置断点。
下面我们就一起来看看如何操作吧!😉
调试链式调用表达式
首先,我们搭建简单的测试环境代码:
import Foundation
class Panda
func eat()
print("Panda eat 🎋")
private func deepMind(_ i: Int) -> Int
i % 2 == 0 ? i : i + 10000
// 熊猫也要思考
func thinking()
let max = Int.random(in: 200...500)
// 如何中断在下面的 deepMind(_) 方法上
let total = (1..<max).map $0 * 2.reduce(0)$0 + deepMind($1)
print("total is \\(total)")
class Feeder
private let panda: Panda
init(panda: Panda)
self.panda = panda
// 返回饲养员喂养的熊猫
func feeding() -> Panda
panda
接着,我们来看一下如何直接中断在链式调用尾部的 eat() 方法上:
let panda = Panda()
let feeder = Feeder(panda: panda)
feeder.feeding().eat() // 如何中断在 eat() 方法上?
panda.thinking()
选中 eat() 方法,鼠标右键呼出上下文菜单,选择其中的 Create Column Breakpoint 子项:
OK!我们已经在 eat() 方法上创建了列断点:
运行App,现在 Xcode 调试器会精确中断在 eat() 方法而不是前面的 feeding() 方法上了!
对于任意深度链式调用中的每个表达式,我们都可以为其设置列断点,可谓非常方便。
调试多重闭包中的表达式
与链式调用相似,列断点也非常适合调试多重闭包中的表达式。
在实际App中,有很大概率我们会遇到如下代码:
func thinking()
let max = Int.random(in: 200...500)
// 如何中断在下面的 deepMind(_) 方法上
let total = (1..<max).map $0 * 2.reduce(0)$0 + deepMind($1)
print("total is \\(total)")
以往来说,我们很难直接中断在 deepMind() 方法上,不过有了列断点后这就是小菜一碟的事了。
选中 deepMind() 方法,鼠标右键呼出上下文菜单,选择 Create Column Breakpoint 子项, deepMind() 上的列断点就新鲜出炉了!
注意,和其他类型断点类似,我们同样可以点击列断点进行编辑、禁用或删除:
现在执行代码,我们可以妥妥的直接命中 deepMind() 方法了,棒棒哒💯!!!
总结
在本篇博文中,我们介绍了 Xcode 13 新推出的列断点(Column Breakpoints),并演示了如何使用列断点让中断位置更加精确。
感谢观赏,再会!
以上是关于如何使用 Xcode 13+ 新的列断点(Column Breakpoints)让中断位置更加精确制导的主要内容,如果未能解决你的问题,请参考以下文章
SwiftUI项目如何在Xcode预览(Preview)中开启调试支持
SwiftUI项目如何在Xcode预览(Preview)中开启调试支持
使用新的 Xcode13+ 编译和运行我的 tvOS 项目,标签栏随 scrollView 滚动,我无法访问拆分视图控制器