[Во-первых, обратите внимание, что я не использую Interface Builder]Модальные NSWindow не выпустили
У меня есть NSWindow показывается как модальный листа, когда элемент меню получает щелчок. Вот код его отображения:
let win = NSWindow(contentRect: NSRect(origin: NSZeroPoint, size: NSSize(width: 650, height: 400)), styleMask: NSResizableWindowMask, backing: .Nonretained, defer: false)
win.releasedWhenClosed = true
setupController = SetupSheetController(window: win)
mainWindow.beginSheet((setupController!.window)!) { (response: NSModalResponse) in
print("didClose")
self.setupController = nil
}
setupController
определяется как экземпляр переменной var setupController: SetupSheetController?
; и SetupSheetController
является подклассом NSWindowController
.
В то время, когда пользователь закончил работу с этим листом, self.window?.sheetParent?.endSheet(self.window!, returnCode: NSModalResponseXXX)
вызывается setupController
.
Моя проблема заключается в том, что ни модальный NSWindow, ни его контроллер не освобождаются. И они не используются повторно, когда я снова открываю модальный лист. Также обратите внимание, что я не ссылаюсь на контроллер в любом другом месте, кроме показанного здесь. Идеи?
Я думаю, что общая идея заключается в том, что после создания окон они должны использоваться повторно на протяжении всей жизни приложения. Создание окон является дорогостоящим, и поэтому поведение по умолчанию заключается в том, чтобы создать окно лениво при первом запросе на показ, а затем просто скрыть его после его завершения. Конечно, это также требует, чтобы вы сохраняли постоянную ссылку на контроллер. – pco494