在一个多窗口的macOS应用中,如何判断是哪一个NSWindow触发了断点?
我正在使用AppKit开发一个macOS应用。该应用可以同时打开多个窗口,类似Finder或 Safari。
当达到断点,或在LLDB中检查状态时,有时我需要知道当前对象所属的是哪个窗口。举例来说,同一个视图控制器类可能存在于多个窗口中,因此当在该视图控制器内部触发断点时,我想知道正在调试的是哪个窗口实例。
目前,我通常会做这样的事情:
print(#function, self)
然后我在控制台查看对象的内存地址。我通过与每个窗口交互并对比打印输出,记下哪个地址对应哪个窗口。
这方法可行,但感觉有些手动且脆弱。它也只告诉我当前对象,不一定能指出所包含的 NSWindow,除非我也显式地打印出来。
例如,我可能会使用类似这样的:
print(#function, self, view.window as Any)
或者在LLDB中检查它:
po self
po self.view.window
po self.view.window?.title
po self.view.window?.windowController
在Xcode、LLDB或 AppKit中,是否有更好、内置的方式来识别一个断点是从哪个 NSWindow 被触发的?
更具体地说:
- 当在视图控制器、视图或响应者对象上命中断点时,是否存在直接显示拥有的
NSWindow的Xcode/LLDB功能? - 检查
self.view.window、self.window、NSApp.keyWindow或NSApp.mainWindow,是不是推荐的做法? keyWindow和mainWindow是否可靠,还是它们可能指向与触发断点的对象所属的窗口不同的窗口?- 开发过程中,是否存在用于命名、标记或以其他方式识别窗口的常见调试模式?
我在寻找的是常见的AppKit/Xcode调试工作流,而不一定是生产特性。
解决方案
对象的内存地址本身就是它的唯一标识符。它就是用来判断两个对象是否相同或不同的方式。这就是常见的调试工作流。如果 self 不是一个窗口,而是一个视图控制器,其视图位于所需的窗口中,请使用 self.view.window。
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。