更改lldb之后,if语句中的false仍为true

时间:2019-04-23 19:30:41

标签: ios swift lldb

在lldb中将布尔值更改为false后,它仍在评估为true。这是简化版。

=>是一个断点

func getCount(actionWasSuccessful successful: Bool) -> Int {
=>  var count = 0

    // (lldb) po successful (returns true)
    // (lldb) exp successful = false
    // (lldb) po successful (returns false)

    if successful {
=>      count += 1 // breakpoint stops here
    } else {
=>      count = 0 // breakpoint should stop here
    }
    return count
}

let count = getCount(successful: true)
print(count) // returns 1

1 个答案:

答案 0 :(得分:3)

Swift会在调试信息中发挥作用。例如,它保留变量的“影子”副本,并报告给调试器,以解决swift积极地删除变量的事实,因为它可以理由是不再可以访问它们。如果没有在定义该变量的整个块中都存在另一个副本,那么您逐步执行该函数时,许多局部变量将变得不可用。卷影副本保持最新状态,但是lldb目前无法将更改从卷影推送到实际变量。

卷影副本解决了一个相当严重的调试问题,但代价是使它很难通过调试器更改变量值。据我了解,对该问题采取更原则性的解决方案并非微不足道。

请通过bugs.swift.org提交与此有关的错误。这将有助于编译人员正确地确定优先级。