我已经在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;
}
我正在做的是将图像淡化为&淡出图像。 &安培;然后再次调用相同的函数。所以这应该崩溃吧?
答案 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];
}