5

我正在构建一个Cocoa应用程序,并且有关于使用窗口控制器的问题。这个想法是,如果用户从菜单栏中选择New,则会创建一个属于NSWindowController子类的MyWindowController实例,并显示一个MyWindow.xib的新窗口。当窗口关闭时释放NSWindowController

我正在处理应用程序委托中的操作。从我看到的东西后,可以做下面的事情。一旦显示窗口,我没有任何理由再将指针存储到窗口控制器,并且自从我分配窗口后,我也在显示窗口之前自动释放它。

[[[[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]; 
} 

有没有更好的方法来做到这一点?我搜查了苹果文档,并没有发现任何使用哪种做法。这听起来像是它应该涵盖的非常基本的东西,所以也许我只是在用错误的术语搜索。

回答

5

通常情况下,您会保留窗口控制器,只有在完成后才能释放窗口控制器。我会说,你的应用程序代表将负责。如果可以有多个,只需将它们存储在一个数组中。虽然你的解决方案可能会起作用,但它不是很优雅。

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

相关问题