无效时,NSTimer在Iphone上与EXC_BAD_ACCESS崩溃

时间:2009-09-18 18:22:55

标签: ios objective-c iphone nstimer exc-bad-access

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

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

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

我可能做错了什么?

谢谢, 莱昂纳多

3 个答案:

答案 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