무효화 될 때 iPhone에서 exc_bad_access와 함께 Nstimer 충돌
-
22-07-2019 - |
문제
응용 프로그램에 두 개의 타이머를 설정하여 몇 초마다 반복됩니다. 타이머를 무효화 할 시간을 제외하고는 모든 것이 잘 작동합니다. 전화기가 잠겨 있으면 해당 타이머를 무효화 한 다음 휴대 전화가 잠금 해제 될 때 재현하고 싶습니다.
알림을 사용하여 타이머를 무효화/생성 할 시점을 실현하기 위해 알림을 사용합니다.
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(notify_didBecomeActive:) name:UIApplicationDidBecomeActiveNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(notify_willResigneActive:) name:UIApplicationWillResignActiveNotification object:nil];
이것이 Notify_didbecomeactive 방법에 포함 된 것입니다.
clockTicker = [[NSTimer scheduledTimerWithTimeInterval: 1
target: self
selector: @selector(showActivity)
userInfo: nil
repeats: YES] retain];
alarmTicker = [[NSTimer scheduledTimerWithTimeInterval: CONST_ALARMTIMER
target: self
selector: @selector(checkAndLaunchAlarm)
userInfo: nil
repeats: YES] retain];
이것은 notify_willresigneactive 메소드에 다음을 포함합니다.
if (alarmTicker) {
[alarmTicker invalidate];
[alarmTicker release];
alarmTicker = NULL;
}
if (clockTicker) {
[clockTicker invalidate];
[clockTicker release];
clockTicker = NULL;
}
문제는 두 번째 타이머를 무효화 할 때 이것을 디버깅 할 때 오류가 발생한다는 것입니다. 이상한 점은 타이머의 순서를 전환하면 (첫 번째 클럭 팅커를 무효화하는 것처럼) 두 번째 타이머에 오류가 여전히 발생한다는 것입니다.
내가 무엇을 잘못 할 수 있습니까?
고마워, 레오나르도
해결책
무효화는 타이머를 방출하고 무효화 후 해제 할 필요가 없습니다. 그러나 나는 당신이 타이머를 유지하고 있다는 것을 알았습니다 ... 이것이 필요하다는 것을 확신하지 못합니다.
다른 팁
당신은 그 타이머가 발사되는 메소드 내부에서 알람 틱과 클럭 턴을 설정하면 (알람 틱) 또는 (clockticker)를 확인할 때 그 방법이 올바른 값을 갖습니다.
타이머를 NUL로 설정하는 것이 무엇인지 잘 모르겠지만, NIL로 설정하는 것과는 반대로, NIL 객체를 호출하면 NO-OP라는 것을 알고 있습니다. 당신이 널 객체를 호출한다면, 나는 이것을 확인하지는 않았지만 충돌한다고 생각합니다. 이 게시물이 도움이 될 수 있습니다. 객체 c에서 null vs nil