MacOSX:窗口关闭时释放NSWindowController

时间:2014-12-12 20:13:44

标签: xcode macos nswindowcontroller

我正在创建一个新的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对象?

我真的很感谢你的帮助

2 个答案:

答案 0 :(得分:9)

首先,窗口(NSWindow或子类的实例)与窗口控制器(NSWindowController或子类的实例)之间存在差异。您的问题和代码似乎可以互换使用这两个术语。

当您使用窗口控制器时,您不会释放窗口本身。窗口控制器拥有它,它将在完成后释放它。同样,窗口控制器拥有的窗口会忽略releasedWhenClosed。这是使用getter -isReleasedWhenClosed记录的。

您的代码显然在myWindow属性中保留了对窗口控制器的强引用(尽管您的代码片段也以一种似乎是窗口控制器的方式引用categoriasView属性)。如果清除该属性,则将释放窗口控制器。如果那是最后一个强引用,那么窗口控制器将被释放,它将释放窗口。

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

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

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(windowWillClose:) name:NSWindowWillCloseNotification object:self.myWindow.window];

然后,您可以在窗口委托以外的对象中实现-windowWillClose:方法。在那种方法中,你会这样做:

- (void)windowWillClose:(NSNotification *)notification
{
    NSWindow* window = notification.object;
    if (window == self.myWindow.window)
        self.myWindow = nil;
    [[NSNotificationCenter defaultCenter] removeObserver:self name:NSWindowWillCloseNotification object:window];
}

答案 1 :(得分:0)

我给卡塔琳娜州两分钱。

有点旧的帖子。 ..但可能会有用:

我将其附加在shouldClose下(以得到更好的控制。但是与最终结果相同)。

简单地设置为nil:

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.
}