窗口关闭时释放NSWindowController

我正在构建一个Cocoa应用程序,并且对使用窗口控制器有疑问。这个想法是,如果用户从菜单栏中选择“新建”,则会创建MyWindowController的实例,该实例是NSWindowController的子类,并显示MyWindow.xib中的新窗口。 我正在处理应用程序委托中的操作。从我在搜索类似以下内容之后所看到的结果,可以完成。一旦显示了窗口,我就没有理由再存储指向窗口控制器的指针了,因为我分配了它,所以我也可以在显示窗口之前自动释放它。
[[[[MyWindowController alloc] init] autorelease] showWindow:self];
由于此后不久将释放该窗口,因此该窗口将短暂显示在屏幕上,然后消失。我找到了一种解决方案,其中将窗口控制器保留在-showWindow:方法中,并使其在获得windowWillClose通知后立即释放。
- (IBAction)showWindow:(id)sender
{
    [self retain];
    [[NSNotificationCenter defaultCenter] addObserverForName:NSWindowWillCloseNotification
                                                      object:self.window
                                                       queue:nil
                                                  usingBlock:^(NSNotification *note) {
                                                      [self release];
                                                  }];
    [super showWindow:sender];
}
有一个更好的方法吗?我已经搜索了Apple文档,但没有找到任何可以使用的实践方法。听起来应该很基础,所以也许我只是在搜索错误的术语。     
已邀请:
        通常,您会坚持使用窗口控制器,并且仅在完成使用后才释放它。我想说,您的应用程序代表将对此负责。只要可以将它们存储在一个数组中即可。尽管您的解决方案可能会起作用,但它不是很好。 如果您正在使用基于文档的Cocoa应用程序,请在文档子类方法makeWindowControllers中创建窗口控制器,并让该类持有指向您的窗口控制器的指针。     
        
func windowShouldClose(_ sender: NSWindow) -> Bool {

    #if DEBUG
    let closingCtl = sender.contentViewController!
    let closingCtlClass = closingCtl.className
    print(\"\\(closingCtlClass) is closing\")
    #endif


    sender.contentViewController = nil // will force deinit.

    return true // allow to close.
}
    

要回复问题请先登录注册