MyAppDelegate
は、アクティブなウィンドウ コントローラのリストを維持して、ARC がそれらの割り当てを早期に解除しないようにします。したがって、次のような通知ハンドラーがあります。
- (void) windowWillClose: (NSNotification*) notification {
[self performSelectorOnMainThread: @selector(removeWindowControllerInMainThread:)
withObject: windowController
waitUntilDone: NO];
}
- (void) removeWindowControllerInMainThread: (id) windowController {
[windowControllers removeObject: windowController];
}
通知スレッドで処理を行うと、準備が整う前にコントローラーの割り当てを解除するリスクがあるため、メイン スレッドを使用します。
現在、これは非常にうまく機能します — 現在実行中のアニメーターがある場合を除きます。を通じて、いくつかの場所でアニメーターを使用しNSAnimationContext
ます。私はこの QAを見てきましたが、答えは受け入れられません。アニメーションを完成させるためだけにしばらく待つのは本当に手抜きで、動作する保証はありません。確かにそうではありません。現在のアニメーションの長さよりも大きな遅延があっても、を使用してみperformSelector:withObject:afterDelay
ましたが、それでもアニメーターは nil オブジェクトに対して実行されます。
このようなコントローラーのクリーンアップを行う好ましい方法は何ですか? 使用するのではなく、代わりに使用するNSAnimationContext
方法があるのはどれですか?NSAnimation
stopAnimation