我正在创建一个新的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对象?
我真的很感谢你的帮助
答案 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.
}