CAAnimation 在发布的 CALayer 上运行回调——Mac OS X
Posted
技术标签:
【中文标题】CAAnimation 在发布的 CALayer 上运行回调——Mac OS X【英文标题】:CAAnimation runs callbacks on released CALayer -- Mac OS X 【发布时间】:2013-12-12 20:29:38 【问题描述】:为了避免模态行为,我允许用户中断正在运行的CABasicAnimation
,并且在此应用程序的上下文中,用户的操作需要一个新的状态,其中现有的CALayers
应该不再存在。我没有使用 ARC(这可能是我的问题,但请忍受这个老派问题)。
当用户采取行动时,对于一组活跃的CALayers
我这样做:
for(CALayer *c in layerArray)
[c removeAllAnimations];
[c removeFromSuperlayer];
[c release];
[layerArray removeAllObjects];
(相信我,无论好坏,这不是CALayers
的过度发布)。但是,从该例程返回并将控制权交还给系统后,系统调用内部 OS 例程 run_animation_callbacks 并崩溃,因为它试图向僵尸发送消息——CALayers
之一已被删除并释放。为什么[c removeAllAnimations]
不足以告诉操作系统停止在该对象上运行回调?
谢谢。
【问题讨论】:
【参考方案1】:想通了,把答案留在这里,以防对其他人有帮助。
当CAAnimation
被移除时(使用上面代码中的removeAllAnimations
调用),它会调用代理的animationDidStop:finished:
方法来告诉代理动画已被中断。 (有趣的是,即使您在删除动画时将 CALayer's
委托设置为 nil,它也会这样做)。
所以你不能在removeAllAnimations
的同时释放对象。相反,我认为animationDidStop:finished:
方法必须有一些方法来检测它是否应该正常处理。
【讨论】:
以上是关于CAAnimation 在发布的 CALayer 上运行回调——Mac OS X的主要内容,如果未能解决你的问题,请参考以下文章
CAAnimation 在发布的 CALayer 上运行回调——Mac OS X