我的GameWindowController
(子类NSWindowController
)中有以下方法:
- (void)windowWillClose:(NSNotification *)notification {
AppDelegate *delegate = [NSApp delegate];
[delegate removeGameWindowController:self];
}
AppDelegate 中 removeGameWindowController 的代码为:
- (void)removeGameWindowController:(GameWindowController*)controller {
[self.controllers removeObject:controller];
}
self.controllers
是一个 NSMutableArray 与我所有的GameWindowControllers
.
上面的代码似乎有一个竞争条件。当我关闭窗口时,它会随机崩溃,EXC_BAD_ACCESS
如果我一次关闭所有窗口,几乎每次都会崩溃。
我的猜测是 ARC 在返回之前或removeGameWindowController:
返回时释放了窗口控制器,使窗口带有一个指向控制器的悬空指针。我试过添加controller.window.windowController = nil;
无济于事。
出于某种原因,按照https://stackoverflow.com/a/11782844/344544(BOOL)windowShouldClose:(id)sender
中的建议使用委托方法是可行的,但不是可接受的解决方案,因为它不会在退出时调用。
在每个窗口关闭后,如何可靠地从控制器数组中删除我的窗口控制器?是否有一些其他的委托方法被调用或一些 NSNotification 在窗口完成关闭后我可以订阅哪个火?