是否有可能在Swift属性上设置观察点?

在Objective-C中,我有时会在LLDB中设置观察点,让我知道实例variables何时发生变化。 我可以用Swift属性来做这个吗?

现在,我能做到的唯一方法是:

  • 在属性中添加一个didSet处理程序并在其中设置一个断点(但是这需要停止程序并重新编译,这种方式会使目标失败)
  • [setPropertyName:]上添加一个符号断点,但这只有在类正好支持Objective-C桥接

我有其他的select吗?

答案比我想像的要简单得多。 最简单的方法是简单地在属性声明中添加一个断点。 只要属性被读取或写入,debugging器就会中断。

如果像我一样,只有在属性发生变化时才会中断,并忽略提取,请在属性声明中设置断点,然后进入LLDB控制台并键入“br list”以查看所有断点的列表:

 (lldb) br list Current breakpoints: 1: file = '/Users/testuser/Desktop/TestFoo/Test.swift', line = 12, locations = 3, resolved = 3, hit count = 1 1.1: where = TestFoo`TestFoo.Test.x.getter : Swift.Int + 12 at Test.swift:12, address = 0x00000001084cfefc, resolved, hit count = 1 1.2: where = TestFoo`TestFoo.Test.x.setter : Swift.Int + 16 at Test.swift:12, address = 0x00000001084cff80, resolved, hit count = 0 1.3: where = TestFoo`TestFoo.Test.x.materializeForSet : Swift.Int + 16 at Test.swift:12, address = 0x00000001084d00f0, resolved, hit count = 0 

正如你所看到的,有三个子断点的主断点“1”。 禁用getter的子断点:

 (lldb) br disable 1.1 1 breakpoints disabled. 

你们都定了 只有当该属性被修改时,debugging器才会中断。

在XCode(8.2 Swift 3.0)通常在swift属性上设置断点,然后运行你的应用程序。 在应用程序运行到断点面板后,您可以将断点展开为多个断点:

在这里输入图像说明

所有的都是默认选中的,然后你可以禁用那些你不需要的。 注:我发现,当你第一次添加断点,它不会扩大,直到你运行的应用程序。

另一种可以尝试的方法是使用lldb来添加它们。 首先添加断点在你的类实例内,例如viewDidLoad ext。 p自己并记下你的实例的内存地址。

然后像这样添加断点,其中0x0f0f0f0f0f0f是类的内存地址。

 break set -F '-[MyClass setMyProperty:]' -c '$rdi == 0x0f0f0f0f0f0f' 
Interesting Posts