Xcode MacOSX:在窗口关闭时释放NSWindowController
我正在创建一个新窗口:Xcode MacOSX:在窗口关闭时释放NSWindowController,xcode,macos,nswindowcontroller,Xcode,Macos,Nswindowcontroller,我正在创建一个新窗口: - (void)newWindow { if (!_myWindow) { self.myWindow = [[myWindowController alloc] initWithWindowNibName:@"myWindow"]; } [self.categoriasView showWindow:self]; } 但我想在窗口从NSWindowController关闭时释放窗口对象,方法是: - (void)wi
- (void)newWindow
{
if (!_myWindow)
{
self.myWindow = [[myWindowController alloc] initWithWindowNibName:@"myWindow"];
}
[self.categoriasView showWindow:self];
}
但我想在窗口从NSWindowController关闭时释放窗口对象,方法是:
- (void)windowWillClose:(NSNotification *)notification
{
}
我尝试过[self.windowsetreleasedwhenclosed:YES];但当窗户关闭后,物体仍然在那里
你们中有人知道在窗口关闭后如何释放NSWindow对象吗
非常感谢您的帮助首先,NSWindow或子类的窗口实例与NSWindowController或子类的窗口控制器实例之间存在差异。您的问题和代码似乎可以互换使用这两个术语 使用窗口控制器时,不会释放窗口本身。窗口控制器拥有它,它将在完成后释放它。同样,对于由窗口控制器拥有的窗口,将忽略releasedWhenClosed。这是用getter记录的 显然,您的代码在myWindow属性中保留了对窗口控制器的强引用,尽管您的代码段也以类似于窗口控制器的方式引用了categoriasView属性。如果清除该属性,将释放窗口控制器。如果这是最后一个强引用,那么窗口控制器将被释放并释放窗口 如果已为窗口指定了代理,则可以清除窗口代理的-windowWillClose:方法中的属性。通常(但不一定)窗口控制器是窗口的代理。你可以在笔尖上设置。但是,在这种情况下,窗口控制器清除其所有者的属性不是很方便 另一种方法是让窗口控制器的所有者观察窗口发出的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];
}
首先,NSWindow或子类的窗口实例与NSWindowController或子类的窗口控制器实例之间存在差异。您的问题和代码似乎可以互换使用这两个术语 使用窗口控制器时,不会释放窗口本身。窗口控制器拥有它,它将在完成后释放它。同样,对于由窗口控制器拥有的窗口,将忽略releasedWhenClosed。这是用getter记录的 显然,您的代码在myWindow属性中保留了对窗口控制器的强引用,尽管您的代码段也以类似于窗口控制器的方式引用了categoriasView属性。如果清除该属性,将释放窗口控制器。如果这是最后一个强引用,那么窗口控制器将被释放并释放窗口 如果已为窗口指定了代理,则可以清除窗口代理的-windowWillClose:方法中的属性。通常(但不一定)窗口控制器是窗口的代理。你可以在笔尖上设置。但是,在这种情况下,窗口控制器清除其所有者的属性不是很方便 另一种方法是让窗口控制器的所有者观察窗口发出的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];
}
我给卡塔琳娜的两分钱 有点旧的帖子。。但也可能有用: 我依附在shouldClose下,以便更好地控制。。但它是一样的。。结果 只需设置为零:
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.
}
我给卡塔琳娜的两分钱 有点旧的帖子。。但也可能有用: 我依附在shouldClose下,以便更好地控制。。但它是一样的。。结果 只需设置为零:
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.
}