2011-11-14 4 views
0

나는 미리 결정된 간격으로 음악을 재생할 수 있도록 여러 개의 타이머를 가지고 있습니다. 내 코드가 아래의 예외로 인해 작동하지 않는 것처럼 올바르게 취소하는지 확인하려고합니다.iPhone 4 iOS5 ARC로 여러 NSTimers를 올바르게 취소하는 방법은 무엇입니까?

내가있는 NSMutableArray 모든 타이머를 추가하려고하고 간단하게 다음과 같이 발사에서 그들을 방지하기 위해 그들의 각 하나 무효화 해요 :

[playTimers addObject:[NSTimer scheduledTimerWithTimeInterval:reminderDelay target:self selector:@selector(appMusicPlayerPlay:) userInfo:nil repeats:NO]]; 

내가 정지 방법은 배열을 통해 이동하고 무효로 기대를 타이머. 타이머에서 removeObject를 호출해야합니까? 아니면 배열을 ARC로 다시 할당하는 것이 더 쉬울까요?

[업데이트 : 여기에 한 번에 모든 타이머 취소에 수정 된 솔루션입니다] :

*** Collection <__NSArrayM: 0x5429330> was mutated while being enumerated. 
여기
-(int)stop 
{ 
    [musicPlayer pause]; 
    [self pause]; 
    @try { 
     for(NSTimer* timer in playTimers) 
     { 
      [timer invalidate]; 
     } 
    } 
    @catch (NSException *exception) { 
     NSLog(@"exception: %@",[exception description]); 
    } 
    @finally { 
     [playTimers removeAllObjects] 

    } 

    state = kRemoteControlStateStopped; 
    return state; 
} 

배열 반복하면서 내가있는 NSMutableArray에서 개체를 제거하는 후 잡기 된 예외의가
+1

이것은 실제로 ARC와 관련이 없습니다. 비 ARC에서 동일한 예외가 발생합니다. for (in) 루프 내에서 콜렉션을 수정할 수 없습니다. –

답변

3

루프를 사용하여 요소를 반복하는 동안 배열 내용을 변경하면 안됩니다. 당신은 항상 모든 타이머를 무효로 할 수 있고 그 후에 어레이에 removeAllObjects을 호출 할 수 있습니다.

+0

한 번에 모든 개체를 제거하는 것에 대한 훌륭한 제안, 그 옵션에 대해 완전히 잊었습니다! –