5

我将 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

4 回答 4

0

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

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

  1. 确定要触发的情况和动画。
  2. 动画完成后标记堆。
  3. 触发某些东西,将您带到另一个应该删除对象的视图。
  4. 根据需要多次重复步骤 1-2-3 中的过程。我通常做大约10次左右。

就是这样..基本上是动画-标记-撤消-动画-标记。如果 CoreAnimation 正确地自动释放对象,您应该会看到 heapshots 减少到 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/

于 2012-02-14T18:19:42.277 回答
0

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

创建实例:

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

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

[animation release];
于 2012-01-26T22:25:16.247 回答
0

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

于 2015-04-23T16:26:37.680 回答
0

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

原来是 CAKeyframeAnimation 委托持有它。我刚刚删除了代表:

beatAnimation.delegate = nil
于 2018-04-15T05:22:16.030 回答