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

CAAnimation - 显示/隐藏持续时间为 0

带有 timeRange 的 CAAnimation - iOS

键-值编码扩展

CAAnimation - 更改动画最后一帧的属性?

如何在IOS中制作月亮绕地球自转同时自转的CAAnimation效果?