MacOSX:当窗口关闭时释放NSWindowController

问题描述 投票:1回答:2

我正在创建一个新的NSWindow:

- (void)newWindow
{
    if (!_myWindow)
    {
        self.myWindow = [[myWindowController alloc] initWithWindowNibName:@"myWindow"];

    }

    [self.categoriasView showWindow:self];
}

但是我想在使用NSWindowController关闭窗口时释放窗口对象:

- (void)windowWillClose:(NSNotification *)notification
{

}

我已经尝试过[self.window setReleasedWhenClosed:YES];但是在关闭窗口后,对象仍然存在。

你们都知道关闭窗口后如何释放NSWindow对象?

非常感谢您的帮助

xcode macos nswindowcontroller
2个回答
13
投票

[首先,窗口(NSWindow或子类的实例)和窗口控制器(NSWindowController或子类的实例)有所不同。您的问题和代码似乎可以互换使用这两个术语。

使用窗口控制器时,请勿释放窗口本身。窗口控制器拥有它,并在完成后将其释放。同样,对于窗口控制器拥有的窗口,releasedWhenClosed被忽略。用getter -isReleasedWhenClosed记录。

您的代码显然在-isReleasedWhenClosed属性中强烈引用了窗口控制器(尽管您的代码段也以类似于窗口控制器的方式引用了myWindow属性)。如果清除该属性,则将释放窗口控制器。如果这是最后一个强引用,则将释放窗口控制器,并释放窗口。

如果已为窗口分配了委托,则可以在窗口委托的categoriasView方法中清除属性。通常,但不一定,窗口控制器是窗口的委托。您可以在NIB中进行设置。但是,在这种情况下,窗口控制器清除其所有者的属性不是很方便。

另一种方法是让窗口控制器的所有者观察窗口发出的-windowWillClose:。您可以这样设置:

NSWindowWillCloseNotification

然后,您可以在窗口委托以外的对象中实现[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(windowWillClose:) name:NSWindowWillCloseNotification object:self.myWindow.window]; 方法。在这种方法中,您将执行以下操作:

-windowWillClose:

0
投票

我给卡塔琳娜州的两分钱。

© www.soinside.com 2019 - 2024. All rights reserved.