【发布时间】:2011-06-20 23:55:43
【问题描述】:
我有一个 CADisplayLink 触发了 Director 对象中的 draw 方法。我想使 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 方法结束,并且不会再次运行。
【问题讨论】:
标签: ios cocos2d-iphone cadisplaylink