链接动画和内存管理

时间:2009-09-22 21:16:03

标签: iphone memory-management animation

有个问题。我有一个子类UIView作为我的背景,我在滚动地面。代码工作非常好,根据Instrumentation,我不会泄漏,也不是我创建的和仍在生活的对象分配增长。

我已经发现在我的应用程序中,在我的子类UIView所拥有的UIImageView中添加动画似乎会增加我的保留计数并在完成后删除所有动画将其放回原位。

我的问题是,当你用一个键添加动画到一个图层时,我假设如果在支持词典中的那个条目位置已经有一个已用过的动画它被释放并进入自动释放池?

例如:


- (void)animationDidStop:(CAAnimation *)theAnimation finished:(BOOL)flag
{
    NSString *keyValue = [theAnimation valueForKey:@"name"];
    if ( [keyValue isEqual:@"step1"] && flag ) {
        groundImageView2.layer.position = endPos;

        CABasicAnimation *position = [CABasicAnimation animationWithKeyPath:@"position"];
        position.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear];
        position.toValue = [NSValue valueWithCGPoint:midEndPos];
        position.duration = (kGroundSpeed/3.8);
        position.fillMode = kCAFillModeForwards;
        [position setDelegate:self];
        [position setRemovedOnCompletion:NO];
        [position setValue:@"step2-1" forKey:@"name"];

        [groundImageView2.layer addAnimation:position forKey:@"positionAnimation"]; 

        groundImageView1.layer.position = startPos;
        position = [CABasicAnimation animationWithKeyPath:@"position"];
        position.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear];
        position.toValue = [NSValue valueWithCGPoint:midStartPos];
        position.duration = (kGroundSpeed/3.8);
        position.fillMode = kCAFillModeForwards;
        [position setDelegate:self];
        [position setRemovedOnCompletion:NO];
        [position setValue:@"step2-2" forKey:@"name"];

        [groundImageView1.layer addAnimation:position forKey:@"positionAnimation"]; 
    }
    else if ( [keyValue isEqual:@"step2-2"] && flag ) {
        groundImageView1.layer.position = midStartPos;

        CABasicAnimation *position = [CABasicAnimation animationWithKeyPath:@"position"];
        position.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear];
        position.toValue = [NSValue valueWithCGPoint:endPos];
        position.duration = 12;
        position.fillMode = kCAFillModeForwards;
        [position setDelegate:self];
        [position setRemovedOnCompletion:NO];
        [position setValue:@"step1" forKey:@"name"];

        [groundImageView1.layer addAnimation:position forKey:@"positionAnimation"]; 
    }
}

这无限地链接动画,正如我所说的那样,它正在运行创建的生物对象分配并没有改变。我假设每次添加动画时都会释放存在于该关键位置的动画。

只是想知道我是对的。另外,我对核心动画相对较新。我试图重新使用动画,但有点不耐烦。是否可以重复使用动画?

谢谢! 布赖恩

1 个答案:

答案 0 :(得分:2)

如果没有Apple的源代码,您的假设很难验证。当您致电addAnimation:forKey:时,CALayer会制作动画对象的副本。 API(在文档或其他地方)无法保证当为同一个键添加另一个时,它将释放正在运行的动画。明确调用removeAnimation:forKey:而不是依赖API来做你想做的事情会更安全。

另外,为什么要在上面的代码中将removedOnCompletion设置为NOCAAnimation的默认行为是在图层完成后从图层中删除,然后在代理上调用animationDidStop:finished:。然后,您可以使用相同的键将任何其他动画添加到图层。这不正是你想要做的吗?看起来你可能会过度思考它。

关于重用动画的问题:由于动画对象在添加到CALayer时被复制,您可以保存对您创建的动画对象的引用,并将其添加到您想要的任意数量的图层中你喜欢的次数。