我将一个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的情况下释放动画内存???
答案 0 :(得分:0)
您正在使用便捷方法来实例化对象。因此,您无法控制实际释放对象的时间。要控制它,您需要分配对象并自行解除它:
创建实例:
CAKeyframeAnimation *animation = [[CAKeyframeAnimation alloc] init];
然后在删除行之后动画完成调用后:
[animation release];
答案 1 :(得分:0)
首先,如果这是一个iOS 5项目,ARC应该为您处理您的版本 - 这真的很棒!
现在 - 我在我的项目中使用了很多动画,并注意到堆中有类似的爆发。我的猜测是CA缓存了许多内部动画。要确认这些项目实际上是自动释放的,我建议使用仪器工具设置分配或泄漏测试并执行以下操作:
就是这样..基本上是动画 - 标记 - 撤消 - 动画 - 标记。如果CoreAnimation正确自动释放对象,您应该会看到快照减少到0或几乎为0!
有关如何进行此类测试的详细信息,请查看以下文章:
答案 2 :(得分:0)
当设置值=图像数组时,我对CAKeyframeAnimation的内存有同样的问题。 我看到我得到的问题是图像是由[UIImage imagewithname:]引起的,默认情况下缓存到内存中。所以我的解决方案是改变使用[UIImage imageWithContentsOfFile:] 希望这有用。
答案 3 :(得分:0)
在我的情况下,添加到imageView和容器视图的CAKeyframeAnimation即使不在视图层次结构上也不会被释放。
事实证明,CAKeyframeAnimation委托持有它。我刚刚删除了代表:
beatAnimation.delegate = nil