xcode - 无法杀死的虚假 NSRunningApplication 坐在我的 Dock 中?

标签 xcode cocoa nsworkspace nsrunningapplication

我正在 OSX 10.9.4 上使用 Xcode 5.1.1 来调试 Cocoa + OpenGL 应用程序。到目前为止,我只在 Xcode 调试器下运行过我的应用程序。上周,我退出 Xcode,却发现我的应用程序的图标仍然位于 Dock 中。使用 Show In Finder 使我在 Xcode 的 DerivedData 中找到了一个调试可执行文件。我最终重新启动电源以摆脱它(更多内容),直到今天一切都很好。但现在我的 Dock 中有两个这样的图标。

问题:这些应用程序无法被杀死!强制退出不会执行任何操作。它们不会显示在使用“ps aux”或事件监视器的进程列表中。重新启动只会陷入试图摆脱它们的循环中。只有强制重新启动 Mac 才有效。

根据 NSWorkspace 的 runningApplication 方法,有与这些应用程序关联的 NSRunningApplication 实例。但进程 ID 与实际进程并不对应。控制台日志中没有任何相关内容。

还有人遇到过这种情况吗?对于让 NSWorkspace 摆脱虚假的 NSRunningApplication 实例有什么建议吗?

最佳答案

编辑: 我发现了问题的根本原因! “拥有”伪僵尸 Dock NSRunningApplication 的应用程序在迭代 IORegistryEntryGetChildIterator() 的每个子项后未调用 IOObjectRelease()。 啊,我花了几个月的时间才终于找到这个问题。 基本上,我使用断点对应用程序“伪僵尸化”其他应用程序的 NSRunningApplication 的确切时刻进行二进制搜索。 还是不明白为什么IORegistry迭代会劫持NSRunningApplication。

<小时/>

这为我解决了这个问题:

sudo killall launchservicesd; sudo killall Dock; sudo killall Finder;

或者在.bashrc中:

alias killdock="sudo killall launchservicesd; sudo killall Dock; sudo killall Finder;"

注意:如果您没有同时终止 Finder,则“在 Finder 中显示...”又名 [[NSWorkspace sharedWorkspace] activateFileViewerSelectingURLs:urls]; 将在我的应用程序中停止工作。

关于xcode - 无法杀死的虚假 NSRunningApplication 坐在我的 Dock 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25648715/

相关文章:

xcode 流无法在 iPhone 上播放

ios - 在 XCode 6 中导出 .xcarchive?

objective-c - 在启用/不启用沙箱的情况下在 Cocoa App 中复制文件

objective-c - macOS Sierra 中的 NSPrintInfo 已更改

objective-c - 收到应用程序在 OSX 上启动的通知

macos - 将 Cocoa 与 AppleScript 结合使用

ios - 无法停止在模拟器中执行Xcode应用程序?

ios:关于 init(frame:) 和 init?(coder:) 的问题

objective-c - 为什么 `__NSArrayI` 不是一种 `[NSArray class]?

objective-c - cocoa [[NSWorkspace 共享工作空间] iconForFile :filePath caused memory leaks