Проблемы с NSOpenPanel и массивной утечкой памяти - PullRequest
0 голосов
/ 05 января 2019

Я разрабатываю графический интерфейс для rsync (RsyncOSX), и в следующей версии планируется добавить графический интерфейс для выбора каталогов. Некоторое время назад я испытывал некоторые проблемы со стабильностью при использовании NSOpenPanel, но теперь я хотел попробовать еще раз. Но, тем не менее, возникают проблемы с использованием NSOpenPanel, консоль выдает следующую ошибку:

Класс FIFinderSyncExtensionHost реализован как в /System/Library/PrivateFrameworks/FinderKit.framework/Versions/A/FinderKit (0x7fff8c017210), так и в /System/Library/PrivateFrameworks/FileProvide/FramendsConver.Fride.Obride.Ovride.Ovride.Ovride.OF FinderSyncCollaborationFileProviderOverride (0x10f1d5dc8). Один из двух будет использован. Какой из них не определен.

Я также запустил приложение с помощью инструментов Xcode и проверил наличие утечек памяти, и каждый раз, открывая NSOpenPanel, возникает огромная утечка памяти.

enter image description here

Кто-нибудь нашел обходной путь? Код для открытия графического интерфейса очень прост:

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 голосов
/ 05 января 2019

Если окно закрывается, чтобы закрыть окно, объекту отправляется сообщение о завершении после завершения текущего события. Для объекта NSWindow значение по умолчанию должно быть освобождено при закрытии, в то время как для объекта NSPanel значение по умолчанию не должно быть выпущено. Вы можете использовать свойство isReleasedWhenClosed для изменения поведения по умолчанию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...