2012-04-30 2 views
0

viewDidLoad에서 내 타이머를 호출하고 있습니다. 타이머가 selector를 처음 호출 할 때 예상되는 결과가 좋습니다. 그러나 점차 호출이 이루어지면 함수는 선택기에 의해 여러 번 호출됩니다. 나는 출력 수가 증가하고 있음을 보여주는 NSLog을 기록했다. 아래 코드가 있습니다. 그것이 상황을 분명하게 바란다.NSTimer에서 셀렉터 기능을 여러 번 호출하지 못하게하려면 어떻게해야합니까?

-(void)viewDidLoad 
{ 
    remainingTicks = 10; 
    [self updateLabel]; 
    myTimer = [NSTimer scheduledTimerWithTimeInterval:1.0 
         target:self 
         selector:@selector(handleTimerTick) 
         userInfo:nil 
         repeats:YES]; 
} 

-(void)handleTimerTick 
{ 
    remainingTicks--; 
    [self updateLabel]; 
    if (remainingTicks <= 0) { 
     [myTimer invalidate]; 
     myTimer = nil; 
     UIButton *but = [[UIButton alloc] init]; 
     if (answerAt == 0) { 
      [buttonA setBackgroundColor:[UIColor greenColor]]; 
     } 
     else if (answerAt == 1) { 
      [buttonB setBackgroundColor:[UIColor greenColor]]; 
     } 
     else if (answerAt == 2) { 
      [buttonC setBackgroundColor:[UIColor greenColor]]; 
     } 
     else { 
      [buttonD setBackgroundColor:[UIColor greenColor]]; 
     } 

     [self performSelector:@selector(next:) withObject:but afterDelay:1.5 ];  
    } 
} 

-(void)updateLabel 
{ 
    timerLabel.text = [[NSNumber numberWithUnsignedInt: remainingTicks] stringValue]; 
} 
+0

로그 출력을 게시 할 수 있습니까? UIButton *하지만 [[UIButton alloc] init]; '1) 버튼이 뷰에 추가되지 않고 2) 확실하게 메모리가 누출 되었습니까? – trojanfoe

+0

ARC를 사용하는 경우 새어 나지 않습니다. –

답변

0

ViewDidLoadUIViewController의 수명 동안 여러 번 호출 할 수 있습니다 (예를 들어, 당신은 메모리 경고를하고보기가 보이지 않을 경우, 컨트롤러를 해제하고 그것을이 필요한 다음 번에 다시로드됩니다). 이 동작을 처리하려면 제대로 당신이해야 하나 : 타이머가) 하나 (예를 들어, if (myTimer == nil) { /* initialize the timer */ } 작성하기 전에

또는

B) 당신의 viewDidUnload 방법에 걸린 타이머를 존재

A) 테스트 여부를 지정합니다. 타이머가 보이지 않는 뷰와 관련된 이벤트를 발생시키지 않기를 바랄 가능성이 높기 때문에 원하는 라인을 따라 더 많이 표시됩니다.

__weak Object *weakSelf = self; 
[NSTimer scheduledTimerWithTimeInterval:5.f target:weakSelf selector:@selector(actionMethod) userInfo:nil repeats:YES]; 

여러번 호출되는 동작을 방지 할 다음 NSTimer의 대상

+0

'viewDidLoad'에 리소스와 타이머를 할당하는 것이 좋습니다. 그러나,'viewDidUnload'에서 그들의 릴리스를 처리해야합니다. 이 경우 viewDidUnload에서 타이머를 무효화해야합니다. –

+0

좋은 지적. 그에 따라 내 대답을 수정했습니다. – Mattia

0

집합이 같은 약한 자기 변수한다.

관련 문제