2012-05-02 2 views
0

는 단순화 무슨 일이 일어나고 있는지 입증 방법의 설정 :NSTimer가 무효화 - 중복 타이머

- (void)timerDidFire { 
    NSLog(@"fire"); 
} 

- (void)resetTimer:(NSTimer *)timer { 
    if (timer) [timer invalidate]; // timer = nil; here doesn't change anything 
    NSLog(@"%@", timer); 
    timer = [NSTimer ...Interval:1 ... repeats:YES]; 
} 

- (IBAction)pressButton { 
    [self resetTimer:myTimer]; 
} 

지우기 내가 뭔가 잘못하고 있어요하지만? 모든 언론에 추가 타이머가 필요한 이유는 무엇입니까?

답변

2

resetTimer: 메서드를 호출 할 때마다 새 NSTimer 인스턴스를 만듭니다. 불행하게도이 메소드의 실행이 끝나면 로컬 변수에 할당되었으므로 새 인스턴스에 대한 모든 참조가 손실됩니다.
메서드 내에서 작성한 타이머가 myTimer 변수에 할당되지 않았습니다. myTimer가 무엇이든간에, 그것은 새로 생성 된 타이머가 아닙니다.

당신은 모든 지역 변수를 덤프 단순히 같은 것을 사용할 수 있습니다 : 나는 그런 뭔가 될 줄 알았는데

- (void)resetTimer { 
    [myTimer invalidate]; // calls to nil are legal, so no need to check before calling invalidate 
    NSLog(@"%@", myTimer); 
    myTimer = [NSTimer ...Interval:1 ... repeats:YES]; 
} 

- (IBAction)pressButton { 
    [self resetTimer]; 
} 
+0

합니다. 멍청한 실수. 왜 내가 지역 변수가 아무 것도 할 것이라고 생각한 이유를 모르겠다. – Thromordyn