私は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
すべての my を持つ NSMutableArrayGameWindowControllers
です。
上記のコードには競合状態があるようです。EXC_BAD_ACCESS
すべてのウィンドウを一度に閉じると、ほとんどの場合、ウィンドウを閉じるとランダムにクラッシュします。
私の推測では、ARC はウィンドウ コントローラーの割り当てを解除する前またはremoveGameWindowController:
返すときに、ウィンドウにコントローラーへのポインターをぶら下げたままにしていると思われます。controller.window.windowController = nil;
無駄に追加しようとしました。
何らかの理由で、https://stackoverflow.com/a/11782844/344544(BOOL)windowShouldClose:(id)sender
で提案されているように代わりにデリゲート メソッドを使用すると機能しますが、終了時に呼び出されないため、受け入れられるソリューションではありません。
各ウィンドウが閉じられた後、コントローラーの配列からウィンドウコントローラーを確実に削除するにはどうすればよいですか? 呼び出される他のデリゲート メソッドや、ウィンドウが閉じた後に発生するサブスクライブできる NSNotification はありますか?