draw
Director オブジェクトのメソッドをトリガーする CADisplayLink があります。CADisplayLink を無効にしてから、Director オブジェクトが使用するシングルトン キャッシュ オブジェクトの割り当てを解除したいと考えています。シングルトン Cache オブジェクトは、draw
メソッドによって保持されません。
Director で呼び出されるメソッドstopAnimation
(このメソッドはメソッドとは関係draw
ありません) で、次のことを行います。
[displayLink invalidate];
次に、シングルトン Cache オブジェクトの解放を開始しますが、CADisplayLink が起動し、draw
メソッドが最後にもう一度呼び出されます。メソッドはdraw
、割り当てが解除されたシングルトン オブジェクトにアクセスしようとし、すべてがクラッシュします。
これはたまにしか発生しません。displayLink が実際に無効になり、draw メソッドの実行が既に終了した後に Cache オブジェクトが解放されるため、アプリがクラッシュしない場合もあります。
Cache オブジェクトを安全に無効にするために、displayLink を無効にした後、draw メソッドの実行が終了し、再度呼び出されないことを確認するにはどうすればよいですか? draw
可能であれば、メソッドを変更したくありません。
displayLink invalidate
を使用してメインスレッドで実行するなど、いくつかの組み合わせを試しました
[self performSelectorOnMainThread:@selector(stopAnimation) withObject:self waitUntilDone:YES]
または使用して currentRunLoop で実行しようとしています
[[NSRunLoop currentRunLoop] performSelector:@selector(stopAnimation) target:self argument:nil order:10 modes:[NSArray arrayWithObject:NSDefaultRunLoopMode]];
ただし、結果は常に同じで、共有キャッシュの解放が早すぎる場合があります。
performSelector:withObject:afterDelay:
また、任意の遅延でメソッドを使用したくありません。displayLink が無効になっていること、draw メソッドが終了していること、および再度実行されないようにしたいと考えています。