删除CAKeyframeAnimation不会释放内存

时间:2012-01-26 16:58:50

标签: iphone cocoa-touch uiimageview core-animation cakeyframeanimation

我将一个CAKeyframeAnimation添加到ImageView图层以表示图像的动画:

CAKeyframeAnimation *animation = [CAKeyframeAnimation animationWithKeyPath:@"contents"];
animation.values = arrayOfImages;
[animation setRemovedOnCompletion:YES];
animation.delegate = self;
[animation setValue:delegate forKey:@"AnimatedImageViewDelegate"];
animation.repeatCount = repeatCount;
animation.fillMode = kCAFillModeForwards;
animation.calculationMode = kCAAnimationDiscrete;
[animation setValue:animationName forKey:@"name"];

当我想开始动画时,我打电话:

animation.duration = duration;
[self.layer addAnimation:animation forKey:animationName];
[self.layer setContents:[animation.values lastObject]];

当动画结束时,我想完全删除它并释放它的内存。

[self.layer removeAllAnimations];       
[self.layer removeAnimationForKey:animationName];

执行此操作,并使用Instruments-Activity Monitor,除非我发布完整的imageView,否则不会重新启动内存。

如何在不破坏UIImageView的情况下释放动画内存???

4 个答案:

答案 0 :(得分:0)

您正在使用便捷方法来实例化对象。因此,您无法控制实际释放对象的时间。要控制它,您需要分配对象并自行解除它:

创建实例:

CAKeyframeAnimation *animation = [[CAKeyframeAnimation alloc] init];

然后在删除行之后动画完成调用后:

[animation release];

答案 1 :(得分:0)

首先,如果这是一个iOS 5项目,ARC应该为您处理您的版本 - 这真的很棒!

现在 - 我在我的项目中使用了很多动画,并注意到堆中有类似的爆发。我的猜测是CA缓存了许多内部动画。要确认这些项目实际上是自动释放的,我建议使用仪器工具设置分配或泄漏测试并执行以下操作:

  1. 确定触发和动画的情况。
  2. 动画完成后标记堆。
  3. 触发一些可以将您带到另一个应该删除对象的视图的内容。
  4. 根据需要多次重复步骤1-2-3中的过程。我通常做大约10次左右。
  5. 就是这样..基本上是动画 - 标记 - 撤消 - 动画 - 标记。如果CoreAnimation正确自动释放对象,您应该会看到快照减少到0或几乎为0!

    有关如何进行此类测试的详细信息,请查看以下文章:

    http://www.friday.com/bbum/2010/10/17/when-is-a-leak-not-a-leak-using-heapshot-analysis-to-find-undesirable-memory-growth/

答案 2 :(得分:0)

当设置值=图像数组时,我对CAKeyframeAnimation的内存有同样的问题。 我看到我得到的问题是图像是由[UIImage imagewithname:]引起的,默认情况下缓存到内存中。所以我的解决方案是改变使用[UIImage imageWithContentsOfFile:] 希望这有用。

答案 3 :(得分:0)

在我的情况下,添加到imageView和容器视图的CAKeyframeAnimation即使不在视图层次结构上也不会被释放。

事实证明,CAKeyframeAnimation委托持有它。我刚刚删除了代表:

beatAnimation.delegate = nil