【问题标题】:Release a NSWindowController when the window is closed当窗口关闭时释放一个 NSWindowController
【发布时间】:2011-09-14 19:55:30
【问题描述】:

我正在构建一个 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 文档,但没有找到关于使用哪些做法的任何内容。这听起来像是应该涵盖的非常基本的东西,所以也许我只是用错误的术语进行搜索。

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:
      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.
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多