状态栏应用程序窗口解除分配

时间:2016-05-22 11:06:06

标签: swift macos cocoa automatic-ref-counting nswindowcontroller

我正在使用本教程开发一个简单的OSX状态/菜单栏应用程序:http://footle.org/WeatherBar/ 这个应用程序将有一个带有“首选项”选项的菜单,该选项应打开首选项窗口。

由于首选项窗口打开很少,我希望仅在需要时创建窗口,然后在关闭后取消分配。

以下是状态菜单控制器的代码,用于控制显示和创建首选项窗口:

class StatusMenuController: NSObject {
    @IBOutlet weak var statusMenu: NSMenu!

    var preferencesWindowCtrl: PreferencesWindowController!

    let statusItem = NSStatusBar.systemStatusBar().statusItemWithLength(NSVariableStatusItemLength)

    override func awakeFromNib() {
        statusItem.title = "MyApp"
        statusItem.menu = statusMenu

        preferencesWindowCtrl= PreferencesWindowController()
    }

    @IBAction func preferencesClicked(sender: NSMenuItem) {
        preferencesWindowCtrl.showWindow(nil)

        /*
         THIS CAUSES THE WINDOW TO BE DEALLOCATED IMMEDIATELY:
         let myPrefWindow = PreferencesWindowController()
         myPrefWindow.showWindow(nil)
        */
    }

    @IBAction func quitClicked(sender: NSMenuItem) {
        NSApplication.sharedApplication().terminate(self)
    }
}

在此代码窗口中,在状态菜单控制器awakeFromNib中实例化,这是我想要避免的(因为它使整个应用程序生命周期内的窗口都处于活动状态)。但是,如果我在preferencesClicked内创建它作为局部变量,它会立即释放,因为这个函数存在(并不奇怪)。

如何确保此窗口在关闭后取消分配?我想为该窗口设置release when closed = true无效,因为引用由StatusMenuController保留。

0 个答案:

没有答案
相关问题