窗口关闭时释放NSWindowController

时间:2011-06-14 15:39:48

标签: objective-c cocoa memory-management nswindow nswindowcontroller

我正在构建一个Cocoa应用程序,并对使用窗口控制器有疑问。我们的想法是,如果用户从菜单栏中选择New,则会创建一个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文档,但没有找到任何可以使用的实践。它听起来像它应该涵盖的非常基本的东西,所以也许我只是用错误的术语搜索。

2 个答案:

答案 0 :(得分:5)

通常你会坚持使用窗口控制器,只有在完成后才能释放它。我会说你的应用代表会对此负责。如果可以有多个,只需将它们存储在一个数组中。虽然你的解决方案可能有用,但它不是很优雅。

如果您正在处理基于文档的Cocoa应用程序,则在文档子类方法makeWindowControllers中创建窗口控制器,并让该类保存指向窗口控制器的指针。

答案 1 :(得分:1)

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.
}