我有一个触发draw
Director 对象中的方法的 CADisplayLink。我想使 CADisplayLink 无效,然后取消分配 Director 对象使用的一些单例缓存对象。该draw
方法不保留单例缓存对象。
在 Director 中调用的一个方法stopAnimation
中(此方法与方法无关draw
),我这样做:
[displayLink invalidate];
然后我开始释放单例缓存对象,但随后 CADisplayLink 触发并且该draw
方法最后一次被调用。这些draw
方法尝试访问已释放的单例对象并且一切都崩溃了。
这只有时会发生:有时应用程序不会崩溃,因为在 displayLink 实际无效并且 draw 方法已经完成运行之后释放了 Cache 对象。
在使 displayLink 无效后,如何检查 draw 方法是否已完成运行并且它不会再次触发,以便安全地使 Cache 对象无效?如果可能的话,我不想修改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 方法结束,并且不会再次运行。