递归不崩溃

时间:2011-11-01 05:45:01

标签: objective-c ios animation recursion

我已经在iPad上编写了一个循环图片查看器,认为这会很快导致堆栈溢出,但到目前为止还没有。它很稳定(不是我在抱怨)。但这是在活动开始之前打开香槟的情况还是......

- (void)showPhotos:(NSMutableArray *)resultSet index:(int)i
{
    i += 1;
    [UIView animateWithDuration:PHOTO_DISPLAY_TIME 
                          delay:0 
                        options:UIViewAnimationOptionCurveLinear | UIViewAnimationOptionAllowUserInteraction
                     animations:^(void) 
    {
        //get photourl & set it to imageview
        [self.photosImage setAlpha:1.0];
    } 
    completion:^(BOOL finished) 
    {
        if(finished)
        {
            [UIView animateWithDuration:PHOTO_DISPLAY_TIME 
                                  delay:0 
                                options:UIViewAnimationOptionCurveLinear | UIViewAnimationOptionAllowUserInteraction
                             animations:^(void) 
             {
                 [self.photosImage setAlpha:0.0];
             } 
                             completion:^(BOOL finished) 
             {
                 if(finished)
                     [self showPhotos:resultSet index:i];
             }];
        }
    }];    
    return;
}

我正在做的是将图像淡化为&淡出图像。 &安培;然后再次调用相同的函数。所以这应该崩溃吧?

3 个答案:

答案 0 :(得分:1)

即使这看起来像递归也不是。动画结束后,将完成块的异步调用。这将在您的方法返回后。

如果您仍然不确定这一点,可以在调试器中验证。只需在第二次调用方法时放置一个断点,并在每次触发时检查堆栈跟踪。

答案 1 :(得分:1)

实际上并没有从showPhotos中调用完成块。它在主运行循环中被调用。 showPhotos将动画排队并完成。稍后当动画完成时,完成排队并且主运行循环运行它。对showPhotos的原始调用已经退出。所以你不必担心堆栈溢出。

答案 2 :(得分:-1)

这实际上就像一个无限循环。您可以通过编程获得相同的效果:

bool forever = YES;

while (forever) {
    //fade in
    //fade out
}

如果该方法在其自身内部调用了一次,则会导致问题。因为这会产生试图在接近同一时间运行的函数的指数倍。

//this would cause issues
- (void)showPhotos:(NSMutableArray *)resultSet index:(int)i {
    [self showPhotos:resultSet index:i];
    [self showPhotos:resultSet index:i];
}