2014-12-09 2 views
0

나는 몇 시간 동안 내 코드를 꼼짝 않고 바라보고 있었기 때문에 나는 신선한 눈을 피하려고 여기에 올 수 있다고 생각했다. 타이머를 만들 필요가있어서 아래 코드를 사용했습니다. 첫 번째 줄은 타이머를 만들고 두 번째 부분은 내 decrementTime 메서드입니다. 이것은 IOS 앱의 목표 C에 있습니다. 이것은 StackOverflow에 게시 한 첫 번째 시간입니다. (일반적으로 나는 찾고있는 답변을 찾았습니다.) 따라서 필자가 따르지 않은 씌어지지 않은 규칙을 알려주십시오.NSTimer가 타이머를 두 줄로 늘리는 이유는 무엇입니까?

_timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(decrementTime) userInfo:nil repeats:YES]; 

- (void)decrementTime{ 
     self.timeLeft--; 
} 

내가 처음 타이머를 무효화 어디 여기에 추가 할 것입니다

-(IBAction)infoClick:(id)sender{ 
     [_timer invalidate]; 
} 

여기에 내 코드에 다른 타이머를

- (void)hideInfoMessage { 
    _secondTimer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(decrementTime) userInfo:nil repeats:YES]; 
} 

설명을 생성 정보 메시지입니다 : 주문 이벤트의 첫 번째 코드 블록 (타이머 만들기)로 시작됩니다. 그런 다음 두 번째 코드 블록이 호출됩니다 (타이머가 무효화됩니다). 마지막으로 내 세 번째 코드 블록이 호출됩니다 (새 타이머 만들기).

코드를 실행할 때 시각적으로 두 번 타이머가 증가하는 것을 볼 수 있기 때문에 두 번 증가한다는 것을 알고 있습니다.

+0

FWIW, 여기서 규칙은 "unwritten"이 아닙니다 - 알아야 할 모든 것에 대한 FAQ를 살펴보십시오). 행운을 빌어 요 – Madbreaks

+1

두 배가 감소하고 있음을 어떻게 알 수 있습니까? – rmaddy

+0

'NSLog (@ "% s", __ FUNCTION __);'를'decrementTime'에 추가하려고 시도 할 때마다 호출됩니다. –

답변

2

타이머를 두 번 생성하는 코드를 호출하는 것은 꽤 쉽습니다. 그렇게하면 실제로는 2 개의 타이머가 동시에 실행됩니다. 각각 하나씩 값이 감소하므로 초당 두 번씩 감소합니다.

예를 들어, viewWillAppear 메서드에서 타이머를 만드는 경우 viewWillDisappear 메서드에서 타이머를 무효화해야만 하나의 타이머가 실행되도록 할 수 있습니다.

동일한 접근 방식은 타이머를 만드는 다른 상황에도 적용됩니다. 타이머를 만드는 모든 호출과 해당 타이머를 무효화하는 호출 간의 균형을 유지해야합니다.

scheduledTimer ... 메소드 중 하나를 사용하는 경우 약한 포인터를 타이머에 저장할 수 있습니다. 실행 루프는 실행되는 한 계속 유지합니다. 이를 무효화하면 시스템 실행 루프에서 루프를 해제하고 할당이 해제됩니다. 그렇게되면 weak 포인터가 0이되므로 viewWillAppear 메서드에서 유효/무효인지 테스트 할 필요가 없습니다.

편집 :

코드를 계측해야합니다. 귀하의 infoClick 메서드에서 변수는 _timer입니까? 주소가 뭐니?

BTW, NSTimer의 대상은 단일 매개 변수 인 타이머 자체를 사용하는 메서드입니다. 당신은 다음과 같이 당신의 decrementTime 방법을 변경해야합니다. (나는이 돈을 내기 것)

- (void) decrementTime: (NSTimer *) timer 
{ 
    NSLog(@"In method decrementTime, timer = %X", (unsigned long) timer) 
    self.timeLeft--; 
} 

이 그런 다음 로그를 확인하고 decrementTime 방법은 2 개 개의 다른 타이머에서 호출되고 있는지

호출에서 가져온 타이머의 주소를 scheduledTimerWithTimeInterval에 기록하고 싶을 수도 있습니다 ...

+0

좋은 대답입니다. 또한 OP는 타이머에 터미널 조건을 표시하지 않습니다. 타이머가 끝나야 할 미래의 시간을 계산하여 저장하고 타이머가 작동하는 현재 시간과 비교하십시오. 대답은 – danh

+0

thansk입니다. 네, 그게 문제였습니다. 하지만 내가 다른 타이머를 만드는 유일한 시간은 내가 게임을 일시 중지 할 때입니다. 나는 첫 번째 타이머를 무효화하고 새 타이머를 만듭니다. – Sooc

+0

@SteveCohen 단지 _timer를 지정하는 줄 바로 앞에 무효화하는 줄을 넣으십시오. – danh

관련 문제