我创建了一个UIView
动画使用下面的代码,通常它工作正常,但偶尔会崩溃:
EXC_BAD_ACCESS(代码= 2,地址=的0xCC)
-(void)continueAnimation
{
[button setImage:[UIImage imageNamed:REFRESHING_IMAGE] forState:UIControlStateNormal];
if (leastTime <= 0) {
leastTime += 360;
}
leastTime -= 10;
angle += 10;
angle %= 360;
[button setEnabled:NO];
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:0.01];
[UIView setAnimationDelegate:self];
[UIView setAnimationDidStopSelector:@selector(continueAnimation)];
button.transform = CGAffineTransformMakeRotation(angle * (M_PI / 180.0f));
[UIView commitAnimations];
}
答案 0 :(得分:0)
EXC_BAD_ACCESS表示已发布某些内容,但您仍然有指向该内存的指针,当您尝试向此无效指针发送消息时,它会崩溃。
- (void)setAnimationDelegate:(id _Nullable)delegate Description
设置任何动画消息的委托。定义的对象 使用setAnimationWillStartSelector注册的方法:和 setAnimationDidStopSelector:方法。这种观点保持强势 在动画持续时间内引用此对象。
在你的情况下,视图会对自身有很强的反应,而且这很糟糕。 看起来像应用程序崩溃,因为有时动画版本会在设置为setAnimationDelegate之前引发animationDelegate,因为它会有一些延迟或类似的东西。
反正 *尽量避免这种动画方式,使用块 *尝试传递__weak typeof(self)wSelf = self;对任何代表和内部块 *看起来你无法阻止那个动画以及应用程序泄漏
要进行图像的无限旋转,您只需执行以下操作:
CABasicAnimation* rotationAnimation;
rotationAnimation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"];
rotationAnimation.toValue = [NSNumber numberWithFloat: M_PI * 2.0];
rotationAnimation.duration = 1;
rotationAnimation.cumulative = YES;
rotationAnimation.repeatCount = HUGE_VALF;
[self.spinnerImg.layer addAnimation:rotationAnimation forKey:@"rotationAnimation"];
请记住,您在从背景或呈现视图返回时重新启动它,例如在pop到viewcontroller之后