2011-11-01 4 views
0

내 iPad에서 루핑 그림 뷰어에 대해 이렇게 코딩 했으므로 매우 빨리 stackoverflow가되지만 아직까지는 그렇지 않습니다. 그것은 안정적입니다 (나는 불평하지 않습니다). 그러나이 사건 전에 샴페인을 여는 경우 또는 ...입니다재귀가 충돌하지 않음

- (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; 
} 

내가 이미지를 페이드 아웃 &의 이미지를 퇴색하고있는 중이 야. & 다음에 동일한 함수를 다시 호출합니다. 이게 바로 추락할까요?

답변

1

재귀 적으로 보일지라도. 완료 블록은 애니메이션이 끝나면 비동기라고 부릅니다. 귀하의 방법이 반환 된 후에이 될 것입니다.

여전히 확실하지 않은 경우 디버거에서 확인할 수 있습니다. 메소드의 두 번째 호출에 중단 점을 놓고 호출 될 때마다 스택 추적을 검사하십시오.

-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]; 
} 
+0

애니메이션 완료 블록이 비동기라고되어 있기 때문에 올바르지 않습니다. – Sven

1

완료 블록은 실제로 showPhotos 내에서 호출되지 않습니다. 메인 실행 루프에서 호출됩니다. showPhotos는 애니메이션을 대기열에 넣고 완료합니다. 나중에 애니메이션이 완료되면 완료가 대기하고 기본 실행 루프가 실행됩니다. showPhotos에 대한 원래 호출은 이미 종료되었습니다. 따라서 스택 오버플로에 대해 걱정할 필요가 없습니다.

관련 문제