解除视图控制器后,CaKeyframeAnimation在后台持久存在

时间:2018-04-21 10:22:06

标签: memory-leaks repeat cashapelayer cakeyframeanimation

您好我有简单的CAShapeLayer动画

   let ballFrameAnimation  = CAKeyframeAnimation()
   aBall.removeFromSuperlayer()

  self.view.layer.addSublayer(aBall)

  ballFrameAnimation.keyPath =  "position"
  ballFrameAnimation.duration = 3.0
  ballFrameAnimation.calculationMode = kCAAnimationDiscrete  
  ballFrameAnimation.fillMode = kCAFillModeForwards
  ballFrameAnimation.isRemovedOnCompletion  = true
  ballFrameAnimation.delegate = self

使用回调来保持重复

func animationDidStop(_ anim: CAAnimation, finished flag: Bool) {

  let name = anim.value(forKey: "name") as? String
  if name == "form" {
      attachAnimation()
       forwardDirection = !forwardDirection

  }

然而,即使我将视图控制器从堆栈中弹出,它仍会在后台(高速)持续存在并循环。它还显示了仪器上的内存泄漏。

 @IBAction func unwindDismiss(_ sender: Any) {

 aBall.removeAnimation(forKey: "ballAnimation")
 aBall.removeFromSuperlayer()
navigationController?.popToRootViewController(animated:true)
dismiss(animated: true, completion: nil)
}

1 个答案:

答案 0 :(得分:0)

很简单。

无限循环动画不会通过简单地解除视图控制器而释放,因此它会在后台持续存在。

添加

if navigationController?.topViewController == self {
动画中的

循环检查确实停止了循环。  这不仅修复了加速的背景循环,还修复了内存泄漏。同时向NOOB同事发出警告:重复使用仪器时:经常关闭并重新启动它们,并清理构建,否则可能会导致软件泄漏。