use*_*482 1 macos xcode nswindowcontroller
我正在创建一个新的NSWindow:
- (void)newWindow
{
if (!_myWindow)
{
self.myWindow = [[myWindowController alloc] initWithWindowNibName:@"myWindow"];
}
[self.categoriasView showWindow:self];
}
Run Code Online (Sandbox Code Playgroud)
但我希望在窗口离NSWindowController关闭时释放窗口对象:
- (void)windowWillClose:(NSNotification *)notification
{
}
Run Code Online (Sandbox Code Playgroud)
我试过[self.window setReleasedWhenClosed:YES]; 但窗口关闭后对象仍然存在.
你们中的任何人都知道在窗口关闭后如何释放NSWindow对象?
我非常感谢你的帮助
Ken*_*ses 13
首先,窗口(实例NSWindow或子类)与窗口控制器(实例NSWindowController或子类)之间存在差异.您的问题和代码似乎可以互换使用这两个术语.
当您使用窗口控制器时,您不会释放窗口本身.窗口控制器拥有它,它将在完成后释放它.同样,releasedWhenClosed窗口控制器拥有的窗口会被忽略.这与getter一起记录-isReleasedWhenClosed.
您的代码显然保留了对myWindow属性中窗口控制器的强引用(尽管您的代码片段也以某种categoriasView类似于窗口控制器的方式引用属性).如果清除该属性,则将释放窗口控制器.如果这是最后一个强引用,那么窗口控制器将被释放,它将释放窗口.
-windowWillClose:如果已为窗口分配了委托,则可以在窗口委托的方法中清除该属性.通常,但不一定,窗口控制器是窗口的委托.您可以在NIB中进行设置.但是,在这种情况下,窗口控制器清除其所有者的属性并不是很方便.
另一种方法是让窗口控制器的所有者观察窗口NSWindowWillCloseNotification发出的内容.您可以这样设置:
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(windowWillClose:) name:NSWindowWillCloseNotification object:self.myWindow.window];
Run Code Online (Sandbox Code Playgroud)
然后,您可以-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];
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2899 次 |
| 最近记录: |