3

我有一个显示模态的 NSWindow/Controller。它有一个“关闭”按钮连接到这样的操作:

- (IBAction)close:(id)sender
{
    [self.window orderOut:sender];
    [self.window close];

    [[NSApplication sharedApplication] stopModal];
}

在我的主窗口中,我显示了模式:

- (IBAction)modal:(id)sender
{
    NSLog(@"Before: %lu", [[[NSApplication sharedApplication] windows] count]);

    ModalWindowController *modal = [[ModalWindowController alloc] initWithWindowNibName:@"ModalWindowController"];
    [[NSApplication sharedApplication] runModalForWindow:modal.window];

    NSLog(@"After: %lu", [[[NSApplication sharedApplication] windows] count]);
}

我打开和关闭模态几次,输出是这样的:

2013-01-17 14:36:08.071 Modals[3666:303] Before: 1
2013-01-17 14:36:08.962 Modals[3666:303] After: 2
2013-01-17 14:36:09.578 Modals[3666:303] Before: 2
2013-01-17 14:36:11.009 Modals[3666:303] After: 3
2013-01-17 14:36:12.108 Modals[3666:303] Before: 3
2013-01-17 14:36:12.910 Modals[3666:303] After: 4

因此,[[[NSApplication sharedApplication] windows] count]只会增加

我希望它随着我打开和关闭模式窗口而增加和减少。我的应用程序使用 ARC。谁可以给我解释一下这个?

先感谢您

4

3 回答 3

3

您正在关闭窗口,但这并没有取消分配它,因为您的窗口控制器ModalWindowController仍在保留它。我在您的示例中没有看到任何表明正在释放窗口控制器的内容。

给您的最简单的答案是让您在调用-runModalForWindow:.

您可能期望窗口控制器在您的窗口关闭时关闭。这是你必须自己做的事情。来自 Apple 文档中的“Window Closing Behavior”:

如果您希望关闭一个窗口以使窗口和窗口控制器在它不是文档的一部分时都消失,您的 NSWindowController 子类可以观察 NSWindowWillCloseNotification 或者作为窗口委托,实现 windowWillClose: 方法并包括以下内容实现中的代码行:“[self autorelease];”

在您的场景中,这可能不是最好的方法,因为在您有机会调用-stopModal.

于 2013-01-17T19:54:35.163 回答
2

看看这个NSWindow方法:

- (void)setReleasedWhenClosed:(BOOL)releasedWhenClosed;

如果您将其设置为YES ,您的窗口将在关闭时被释放。但请注意,当计数为零时,它将被释放。

于 2013-01-17T19:56:44.463 回答
0

对于 Swift 5 人来说,这对我有用。在这种情况下,我想正确关闭每个窗口,除非它是最后一个窗口,在这种情况下,我希望它隐藏

  func windowShouldClose(_ sender: NSWindow) -> Bool {
    sender.isReleasedWhenClosed = true
    if NSApp.windows.count > 1 {
        return true
    }
    NSApp.hide(nil)
    return false
}
于 2019-06-11T15:44:43.067 回答