我正在开发用于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时,都会发生巨大的内存泄漏。
有人找到解决方法吗?打开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()仅减少内存泄漏。
答案 0 :(得分:0)
如果将窗口设置为在关闭时释放,则在当前事件完成后将释放消息发送到对象。对于NSWindow对象,默认值将在关闭时释放,而对于NSPanel对象,默认值将不释放。您可以使用isReleasedWhenClosed
属性来更改默认行为。