【问题标题】:CAAnimation runs callbacks on released CALayer -- Mac OS XCAAnimation 在发布的 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] 不足以告诉操作系统停止在该对象上运行回调?

谢谢。

【问题讨论】:

    标签: macos caanimation


    【解决方案1】:

    想通了,把答案留在这里,以防对其他人有帮助。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-22
      • 2012-02-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多