【问题标题】:UIAnimation causes XCode to crash after timeUIAnimation 导致 XCode 在一段时间后崩溃
【发布时间】:2013-02-24 12:45:39
【问题描述】:

我的应用在闲置 5-7 分钟后在 XCode 中崩溃。我确定这与用于加载屏幕的动画有关 - 我粘贴了下面的代码。

我尝试启用 Zombie Objects 以查看它是否是对已释放对象的调用,并附上调试窗口崩溃时的屏幕截图。

顺便说一句 - 如果我按“恢复”,应用程序将继续正常运行..

编辑:这是第一次。我设置的全局断点在[UIView animateWithDuration:0.2... 行停止,这是输出代码(这次硬崩溃了):

XYZ(14098,0xac3eaa28) malloc: *** mmap(size=2097152) failed (error code=12)
*** error: can't allocate region
*** set a breakpoint in malloc_error_break to debug 2013-02-23 13:19:36.653 XYZ[14098:c07] *** Terminating app due to uncaught exception 'NSMallocException', reason: '*** -[NSObject allocWithZone:]: attempt to allocate object of class 'UIViewAnimationState' failed'
*** First throw call stack: (0x1cf3012 0x17e8e7e 0x1d7e1a4 0x17fca6b 0x17fca55 0x3acceb 0x3baeec 0x3bb1a7 0x37785 0x3badf6 0x3add66 0x3adf04 0x10fc7d8 0x196d014 0x195d7d5 0x1c99af5 0x1c98f44 0x1c98e1b 0x28f17e3 0x28f1668 0x36fffc 0x28fd 0x2825) libc++abi.dylib: terminate called throwing an exception

- (void)startAnimating
{   
    _isAnimating = YES;
    float rotationAngle = 360.0 / 3;
    [UIView animateWithDuration:0.5
                          delay:0.0
                        options:UIViewAnimationOptionCurveEaseInOut
                     animations:^
    {
        self.marks.transform = CGAffineTransformRotate(self.marks.transform,
                                                       ((rotationAngle + 10) * (M_PI / 180.0)));
//        self.marks.transform = CGAffineTransformMakeRotation((rotationAngle + 10) * (M_PI / 180.0));
    }
                     completion:^(BOOL finished)
    {
        [UIView animateWithDuration:0.2
                              delay:0.0
                            options:UIViewAnimationOptionCurveEaseInOut
                         animations:^
        {
            self.marks.transform = CGAffineTransformRotate(self.marks.transform,
                                                           -10 * (M_PI / 180.0));
//            self.marks.transform = CGAffineTransformMakeRotation(-10 * (M_PI / 180.0));
        }
                         completion:^(BOOL finished)
        {
            self.marks.transform = CGAffineTransformIdentity;
            [self startAnimating];
        }];
    }];
}

正常崩溃时的截图:

NSZombieObjects 开启时的截图:

【问题讨论】:

  • 手动将其设置为重复的CAKeyframeAnimation 会更有效,但暂且不说,如果您将[self startAnimating] 切换为[self performSelector:@selector(startAnimating) withObject:nil afterDelay:0.0] 会发生什么——只是为了规则当您尝试在旧的回调中创建新的时,动画块的旧内部模式设置不会以某种方式失败的可能性。
  • 感谢您的建议。更改代码以执行选择器后,我仍然遇到崩溃 - 尽管现在日志有点不同:link。之前没用过Keyframeanimation,以后再看看吧。

标签: iphone ios crash uianimation


【解决方案1】:

第二个动画的完成块递归调用 startAnimating。我认为这是问题的原因。您应该改用循环或创建重复动画。

【讨论】:

  • 删除对 startAnimating 的递归调用,而是添加 options:UIViewAnimationOptionCurveEaseInOut | UIViewAnimationOptionRepeat 似乎已经解决了这个问题。然而,加载视图的工作方式是在需要时隐藏并显示。我发现我还必须手动 removeAllAnimations 并在 hide/show 方法调用中调用 startAnimating,否则当它再次显示时它不会动画。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-05
  • 2019-03-12
相关资源
最近更新 更多