iOS应用程序在[UIView animateKeyframesWithDuration:]期间崩溃

时间:2014-03-14 08:10:19

标签: ios objective-c uiviewanimation

我有一个带有关键帧动画的iOS应用。一旦最后一个关键帧即将完成,我的应用程序会因此错误而崩溃:

 *** Terminating app due to uncaught exception 'NSRangeException', 
reason: '*** -[__NSArrayM objectAtIndex:]: index 4294967295 beyond 
bounds for empty array'

我怀疑这可能是无意中嵌套动画的问题。有没有人遇到这样的问题?

如果我用普通动画块替换关键帧动画,则应用程序不会崩溃。

在关键帧动画中,我更改了滚动视图和其他一些内容的内容偏移。我添加了objc消息日志记录,但即使这样也没有说明为什么会发生这种情况。

完整堆栈跟踪:

*** First throw call stack:
(
    0   CoreFoundation                      0x021b15e4 __exceptionPreprocess + 180
    1   libobjc.A.dylib                     0x01b968b6 objc_exception_throw + 44
    2   CoreFoundation                      0x021524e6 -[__NSArrayM objectAtIndex:] + 246
    3   UIKit                               0x0095288d __35-[UIViewKeyframeAnimationState pop]_block_invoke_3 + 415
    4   CoreFoundation                      0x0222e446 __53-[__NSArrayM enumerateObjectsWithOptions:usingBlock:]_block_invoke + 102
    5   CoreFoundation                      0x0222e352 -[__NSArrayM enumerateObjectsWithOptions:usingBlock:] + 290
    6   CoreFoundation                      0x021ab0a5 -[NSArray enumerateObjectsUsingBlock:] + 53
    7   UIKit                               0x009524e7 __35-[UIViewKeyframeAnimationState pop]_block_invoke + 518
    8   CoreFoundation                      0x0223b13a __65-[__NSDictionaryM enumerateKeysAndObjectsWithOptions:usingBlock:]_block_invoke + 106
    9   CoreFoundation                      0x0223b03e -[__NSDictionaryM enumerateKeysAndObjectsWithOptions:usingBlock:] + 190
    10  CoreFoundation                      0x0219f525 -[NSDictionary enumerateKeysAndObjectsUsingBlock:] + 53
    11  UIKit                               0x00952268 -[UIViewKeyframeAnimationState pop] + 385
    12  UIKit                               0x0094f336 +[UIViewAnimationState popAnimationState] + 47
    13  UIKit                               0x0096729a +[UIView(UIViewAnimationWithBlocks) _setupAnimationWithDuration:delay:view:options:factory:animations:start:animationStateGenerator:completion:] + 508
    14  UIKit                               0x009688b9 +[UIView(UIViewKeyframeAnimations) animateKeyframesWithDuration:delay:options:animations:completion:] + 163

更新:(相关代码)

我逐步调试了调试器中的代码。动画块完成得很好。一旦我跨过线进入完成块,就会发生崩溃。

当我将开始时间设置为>时,它只会崩溃0

有问题的数组似乎是动画堆栈的一部分,而不是我自己的数组之一(在我的动画代码中没有访问过)。

有没有办法转储UIView动画状态?

[UIView animateKeyframesWithDuration:1.0 delay:0.0 options:0 animations:^{

        [UIView addKeyframeWithRelativeStartTime:0.1 relativeDuration:0.9 animations:^{

            snapshot.center = snapshotAwayCenter;
            snapshot.transform = rotateOutTransform;

            CGFloat pageOffset = ...// calculate page offset
            self.scrollView.contentOffset = CGPointMake(pageOffset, 0.0);

            // block returns (stepped through in debugger)
        }];

    } completion:^(BOOL finished){ // When stepping over this line, the crash happens
        // more stuff here
}];

1 个答案:

答案 0 :(得分:2)

崩溃不是由于UIView的addKeyframeWithRelativeStartTime:方法。

由于您访问的数组中的元素超出了数组中的项目数,因此会发生这种情况。看看你的代码,我看不到你在哪里使用数组,但请放心,你是在某个地方做的(可能是你忽略了发布的代码)。

由于明显访问索引:4294967295,您显然是在尝试访问索引-1处的元素,但它是无符号的,因此显示为4294967295。