xcode13 没有iOS16 xcode13怎么用_列断点

概览

Xcode 13 之前,我们在调试链式调用或多重闭包中的表达式时,总是无法在希望的位置插入断点。

如果小伙伴们不太明白我的意思,请看如下示例:

xcode13 没有iOS16 xcode13怎么用_列断点_02

xcode13 没有iOS16 xcode13怎么用_调试_03

如上图所示,在对应行下断点只会中断在该行第一个表达式上,而无法中断更深层的表达式。我们只有不停地 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 子项:

xcode13 没有iOS16 xcode13怎么用_列断点_04

OK!我们已经在 eat() 方法上创建了列断点:

xcode13 没有iOS16 xcode13怎么用_xcode13 没有iOS16_05

运行App,现在 Xcode 调试器会精确中断在 eat() 方法而不是前面的 feeding() 方法上了!

xcode13 没有iOS16 xcode13怎么用_xcode13 没有iOS16_06

对于任意深度链式调用中的每个表达式,我们都可以为其设置列断点,可谓非常方便。

调试多重闭包中的表达式

与链式调用相似,列断点也非常适合调试多重闭包中的表达式。

在实际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() 上的列断点就新鲜出炉了!

注意,和其他类型断点类似,我们同样可以点击列断点进行编辑、禁用或删除:

xcode13 没有iOS16 xcode13怎么用_列断点_07

现在执行代码,我们可以妥妥的直接命中 deepMind() 方法了,棒棒哒💯!!!

总结

在本篇博文中,我们介绍了 Xcode 13 新推出的列断点(Column Breakpoints),并演示了如何使用列断点让中断位置更加精确。

感谢观赏,再会!