我已经看到了,这是一个附加的。
我不能让它正常工作。我有一个动画,我想释放它在动画结束后运行的控制器。
示例:控制器从右->左转换,然后释放自身。
定义动画:
NSValue *end = [NSValue valueWithCGPoint:CGPointMake(800, self.view.center.y)];
NSValue *start = [NSValue valueWithCGPoint:self.view.center];
CABasicAnimation *moveAnimation;
moveAnimation = [CABasicAnimation animationWithKeyPath:@"position"];
moveAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
moveAnimation.duration = 0.45f;
moveAnimation.fromValue = start;
moveAnimation.toValue = end;
// actually set the position
[self.view.layer setPosition:[end CGPointValue]];
moveAnimation.delegate = self;
moveAnimation.removedOnCompletion = NO;
[self.view.layer addAnimation:moveAnimation forKey:MOVING_OUT];
在委托方法内部:
- (void) animationDidStop:(CAAnimation *)theAnimation finished:(BOOL)flag
{
CAAnimation *check = [self.view.layer animationForKey:MOVING_OUT];
if (theAnimation == check)
{
//[check release];
[self release];
}
}
如果我保持这段代码不变,我的控制器就不会被释放(由于动画的retain调用)。
如果我运行
[check release]
,就会得到message sent to deallocated instance
。有人知道怎么了吗?
是否有另一种方法来标识
animationDidStop
委托中的caanimation而不指定removedOnCompletion = NO
?编辑:
忘了提。如果不指定
removedOnCompletion = NO
,animationForKey:
将返回空值。因此我无法识别动画。谢谢!
最佳答案
目前尚不清楚您的问题所在,但它可能有助于您了解CAAnimation
实例是通用kvo容器,因此您可以向它们添加自定义信息:
[myAnimation setValue: @"check" forKey: @"name"];
然后您可以检查:
if ([[theAnimation valueForKey: @"name"] isEqual: @"check"])
// ...
有帮助吗?