NSOpenPanel问题和大量内存泄漏

时间:2019-01-05 12:47:30

标签: swift macos-mojave

我正在开发用于rsync(RsyncOSX)的GUI,并且在下一版本中,该计划是添加用于选择目录的GUI。我前段时间遇到了一些使用NSOpenPanel的稳定性问题,但是现在我想再试一次。但是利用NSOpenPanel似乎仍然存在问题,控制台会产生以下错误:

FIFinderSyncExtensionHost类在/System/Library/PrivateFrameworks/FinderKit.framework/Versions/A/FinderKit(0x7fff8c017210)和/System/Library/PrivateFrameworks/FileProvider.framework/OverrideBundles/FinderSyncCollaborationFileProviderOverride.bundle/Contents/OS中都实现FinderSyncCollaborationFileProviderOverride(0x10f1d5dc8)。将使用两者之一。哪个未定义。

我还通过Xcode工具运行了该应用程序,并检查了内存泄漏,每次打开NSOpenPanel时,都会发生巨大的内存泄漏。

enter image description here

有人找到解决方法吗?打开GUI的代码非常简单:

private func openfiledlg (title: String, message: String) {
    let openPanel = NSOpenPanel()
    openPanel.prompt = "Select"
    openPanel.allowsMultipleSelection = false
    openPanel.canChooseDirectories = true
    openPanel.canCreateDirectories = true
    openPanel.canChooseFiles = false
    openPanel.resolvesAliases = true
    openPanel.title = title
    openPanel.message = message
    if self.modal {
        let OK = openPanel.runModal()
        if OK.rawValue == NSApplication.ModalResponse.OK.rawValue {
            self.urlpath = openPanel.url
        }
    } else {
        openPanel.begin(completionHandler: { response in
            if response.rawValue == NSFileHandlingPanelOKButton {
                self.urlpath = openPanel.url
            }
            openPanel.close()
        })
    }

}

设置弱变量var openPanel = NSOpenPanel()仅减少内存泄漏。

1 个答案:

答案 0 :(得分:0)

如果将窗口设置为在关闭时释放,则在当前事件完成后将释放消息发送到对象。对于NSWindow对象,默认值将在关闭时释放,而对于NSPanel对象,默认值将不释放。您可以使用isReleasedWhenClosed属性来更改默认行为。