我在我的应用程序中设置了两个计时器,它们每隔几秒重复一次。 除非是时间使计时器无效,否则一切正常。 当手机被锁定时,我想让这些计时器无效,然后在手机解锁时重新创建它们。
我使用通知来实现何时无效/创建计时器。
[[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无效)..我仍然在第二个定时器上得到错误。
我可能做错了什么?
谢谢, 莱昂纳多
答案 0 :(得分:5)
invalidate释放计时器,无效后无需释放,这就是为什么它会崩溃。但我只是注意到你保留了计时器...我不确定这是否也是必要的。
答案 1 :(得分:0)
你只需要在那些定时器触发的方法中将alarmTicker和clockTicker设置为nil,当你检查if(alarmTicker)或if(clockTicker)时它们是否具有正确的值。
答案 2 :(得分:-1)
我不确定将计时器设置为NULL是什么,而不是将其设置为nil,但我知道如果你对一个nil对象进行调用,那就是一个no-op。如果你对一个NULL对象进行调用,它认为它崩溃了,虽然我没有验证这一点。这篇文章可能有所帮助:NULL vs nil in Objective-C