3

我在我的应用程序中设置了两个计时器,它们每隔几秒重复一次。一切正常,除了何时使计时器无效。当手机被锁定时,我想使这些计时器无效,然后在手机解锁时重新创建它们。

我使用通知来实现何时使计时器无效/创建。

    [[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 无效).. 我仍然在第二个计时器上遇到错误。

我可能做错了什么?

谢谢,莱昂纳多

4

3 回答 3

5

无效释放计时器,无效后无需释放,这就是它崩溃的原因。但我只是注意到你保留了计时器……我也不确定这是否有必要。

于 2009-09-18T18:38:51.513 回答
0

您只需在这些计时器触发的方法中将 alarmTicker 和 clockTicker 设置为 nil ,这样当您检查 (alarmTicker) 或 (clockTicker) 是否具有正确的值时。

于 2012-08-03T18:52:29.413 回答
-1

我不确定将计时器设置为 NULL 与将其设置为 nil 相比有何作用,但我知道如果您对 nil 对象进行调用,则它是无操作的。如果您对 NULL 对象进行调用,它会认为它会崩溃,尽管我尚未对此进行验证。这篇文章可能会有所帮助:Objective-C 中的 NULL vs nil

于 2009-11-06T22:03:11.863 回答