CAAnimation在已发布的CALayer - Mac OS X上运行回调

时间:2013-12-12 20:29:39

标签: macos caanimation

为了避免模态行为,我允许用户中断正在运行的CABasicAnimation,并且在此应用程序的上下文中,用户的操作会调用现有CALayers应该存在的新状态不复存在。我不是在使用ARC(也许这是我的问题,但请耐受这个老派问题)。

当用户采取行动时,对于一组活跃的CALayers我执行此操作:

for(CALayer *c in layerArray){
    [c removeAllAnimations];
    [c removeFromSuperlayer];
    [c release];
}
[layerArray removeAllObjects]; 

(相信我,无论好坏,这都不是CALayers的过度释放。但是,从该例程返回并将控制权交还给系统后,系统会调用内部操作系统例程run_animation_callbacks并崩溃,因为它正在尝试向僵尸发送消息 - 已删除并释放的CALayers之一。为什么[c removeAllAnimations]不足以告诉操作系统停止在该对象上运行回调?

感谢。

1 个答案:

答案 0 :(得分:0)

想出来,留下答案,以防其他人有用。

当删除CAAnimation时(在上面的代码中使用removeAllAnimations调用),它会调用委托的animationDidStop:finished:方法告诉委托该动画已被中断。 (有趣的是,即使你在删除动画时将CALayer's委托设置为nil也是如此)。

所以你不能removeAllAnimations同时释放对象。相反,我认为animationDidStop:finished:方法必须有一些方法来检测它是否应该正常处理。