iOS setAnimationDidStopSelector方法导致崩溃

时间:2015-12-10 10:23:22

标签: ios objective-c

我创建了一个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];
}

1 个答案:

答案 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之后