如何知道xcode swift中变量值的变化

Mos*_*fat 0 debugging xcode swift

我有这种情况,我有一个静态变量,它在应用程序的某个地方改变它的值,导致一个错误.没有详细介绍代码.我需要知道是否有办法观察这个变量.因为在Xcode上每次尝试观察变量它都会给我这个错误"错误:在这个框架中找不到名为'backend'的变量".

所以我的问题是,是否有任何解决方法可以知道哪个地方确实改变了这个变量的值.

除了使用手表之外的任何东西,因为由于某种原因它不能用于上述错误.

nhg*_*rif 6

您可以向变量添加属性观察者(didSet或者willSet),并在那里设置断点并在命中断点时查看帧,或者可以记录当前线程的当前堆栈跟踪.


对于第一个示例,在属性观察器中的一个简单断点,我已经设置了以下非常简单的类:

class Observable {
    static var someProperty: String? {
        willSet {
            print("Some property will be set.")
        }
        didSet {
            print("Some property has been set.")
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

有断点:

在此输入图像描述

我只是从单元测试中运行此代码,但您可以在任何地方获得相同的结果.这是我用以下方法触发更改的代码:

class ObservableTests: XCTestCase {
    func testObservable() {
        Observable.someProperty = "foo"
        Observable.someProperty = "bar"
        Observable.someProperty = "baz"
    }
}
Run Code Online (Sandbox Code Playgroud)

当代码运行时,我们将在断点处停在这里:

在此输入图像描述

我特意将这个截图框架化了.我们看到绿线和蓝色箭头突出显示我们正在停止的断点,但是看左边.我们可以看到我们在哪个线程以及我们如何达到这个特定点.重要的是,我们可以在堆栈中向上和向下点击.

在这里,堆栈中的大多数帧只向我们展示了无用的汇编代码.如果我们查找一个框架,这就是我们所看到的:

在此输入图像描述

但是如果我们再向上一帧,我们就会得到修改变量的代码:

在此输入图像描述

明确地说,我点击的部分跳转到代码的不同部分,这些部分导致这个变量被设置在这里:

在此输入图像描述


如上所述,打印堆栈跟踪也是一种选择,尽管效率明显较低.

如果我们改变我们willSet并且didSet看起来更像这样:

class Observable {
    static var someProperty: String? {
        willSet {
            for symbol: String in NSThread.callStackSymbols() {
                print(symbol)
            }
        }
        didSet {
            for symbol: String in NSThread.callStackSymbols() {
                print(symbol)
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后我们将能够看到日志中打印的完整堆栈跟踪,如下所示:

在此输入图像描述

上面屏幕截图中的兴趣点是这两个:

2   TTDSamplesTests                     0x00000001087603fa _TFC15TTDSamplesTests15ObservableTests14testObservablefS0_FT_T_ + 74
3   TTDSamplesTests                     0x0000000108760492 _TToFC15TTDSamplesTests15ObservableTests14testObservablefS0_FT_T_ + 34
Run Code Online (Sandbox Code Playgroud)

它很难破译,但你可以从中挑选出部分.

_TFC15 TTDSamplesTests 15 ObservableTests 14 testObservable fS0_FT_T_

  • 我运行此代码的目标名称是TTDSamplesTests.
  • 该方法所在的名称称为ObservableTests.
  • 调用setter 的方法名称称为testObservable.