我正在使用本教程开发一个简单的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
保留。