我有一个NSWindow/控制器,我显示模式。它有一个“关闭”按钮,连接到这样的动作:
- (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]计数]只会不断增加。
我希望当我打开和关闭模态窗口时,它会增加和减少。我的应用程序使用ARC。有人能给我解释一下吗?
提前谢谢你
发布于 2013-01-17 19:54:35
您正在关闭您的窗口,但这并不是解除它,因为您的窗口控制器ModalWindowController仍然保留它。我在您的示例中没有看到任何指示窗口控制器正在释放的东西。
提供给您的最简单的答案是在调用-runModalForWindow:之后让您释放窗口控制器。
您可能期望的是窗口控制器在窗口关闭时关闭。这是你自己必须要做的事。来自苹果文档中的“关闭窗口行为”:
如果希望关闭窗口使窗口和窗口控制器在不属于文档的情况下消失,则NSWindowController的子类可以观察NSWindowWillCloseNotification,或者作为窗口委托实现windowWillClose:方法,并在实现中包含以下代码行:“自自动释放;”
在您的场景中,这可能不是最好的方法,因为在您有机会调用-stopModal之前,您将同时处理窗口控制器和窗口。
发布于 2013-01-17 19:56:44
看看这个NSWindow方法:
- (void)setReleasedWhenClosed:(BOOL)releasedWhenClosed;如果您将其设置为“是”,则关闭时将释放您的窗口。但是要小心,当计数为零时,它将被取消分配。
发布于 2019-06-11 15:44:43
对于斯威夫特5人来说,这对我来说是可行的。在这种情况下,我想正确地关闭每一个窗口,除非它是最后一个窗口,在这种情况下,我希望它隐藏
func windowShouldClose(_ sender: NSWindow) -> Bool {
sender.isReleasedWhenClosed = true
if NSApp.windows.count > 1 {
return true
}
NSApp.hide(nil)
return false
}https://stackoverflow.com/questions/14386802
复制相似问题