如何停止我不知道是否已发布的 NSTimer



很抱歉问这个问题,但现在已经是第三天了,我试图解决这个问题,到目前为止没有任何进展。

问题在于:在游戏中,用户在回答一个问题和下一个问题之间有一个停顿。在其他情况下,游戏玩法中也存在这样的停顿。为此,我使用一个NSTimer。

在。h中我有:

@property(nonatomic,retain) NSTimer *scheduleTimer;

和。m

@synthesize scheduleTimer;
scheduleTimer = [NSTimer scheduledTimerWithTimeInterval:1.0 target: self selector: @selector(playFeedbackSound) userInfo: nil repeats: NO];

现在工作得很好。但是当用户退出ViewController时,我需要使计时器失效。否则计时器将触发,然后崩溃应用程序或弹出不属于其他视图的内容等。

所以我写:

- (void)viewWillDisappear:(BOOL)animated {
    [scheduleTimer invalidate];   
}

如果计时器已经设置了,这个就可以完成任务了。但是如果没有这样的定时器,应用程序就会崩溃。

我可能尝试了所有的东西,包括@try(这也会使应用程序崩溃,Zombie说"* -[CFRunLoopTimer invalidate]:消息发送到deallocated实例0x567640")。因为计时器在完成后会被释放,所以[scheduleTimer isValid]也会导致应用程序崩溃。

现在我已经很绝望了,作为最后的手段,我正在考虑用UIView animateWithDuration替换计时器,它不做任何可见的事情。

然而,我认为这应该是一个相当标准的情况。我只是不知道为什么我找不到这个显而易见的任务的答案。你能帮忙吗?谢谢你

我认为问题是NSTimer在您invalidate之前自动释放。

所以你应该这样做:

scheduleTimer = [[NSTimer scheduledTimerWithTimeInterval:1.0 target: self selector: @selector(playFeedbackSound) userInfo: nil repeats: NO] retain];

你也应该release的定时器在viewWillDisappear:

[scheduleTimer release];
但一个更好的解决方案可能是使用点属性语法来处理retain/release:
self.scheduleTimer = [NSTimer scheduledTimerWithTimeInterval:1.0 target: self selector: @selector(playFeedbackSound) userInfo: nil repeats: NO];

然后:

- (void)viewWillDisappear:(BOOL)animated {
    if (self.scheduleTimer != nil) {
        [self.scheduleTimer invalidate];
        self.scheduleTimer = nil;
    }
}

创建一个方法使计时器失效,并将该属性设置为nil:

- (void) invalidateTimer
{
    if (self.scheduleTimer) {
       [self.scheduleTimer invalidate];   
       self.scheduleTimer = nil;  
    }
}

…然后在你使计时器失效时调用那个方法。例如:

- (void)viewWillDisappear:(BOOL)animated 
{
   [super viewWillDisappear: animated];
   [self invalidateTimer];
}

通过使用:

确保你的计时器被保留

self.scheduleTimer = [NSTimer scheduledTimerWithTimeInterval:1.0 target: self selector: @selector(playFeedbackSound) userInfo: nil repeats: NO];

最新更新