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

时间:2011-09-29 10:04:29

标签: iphone xcode crash nstimer

很抱歉提出这个问题,但现在是第3天我试图解决这个问题,到目前为止还没有进展。

问题在于:在游戏中,用户回答问题和下一个问题之间存在暂停。此外,在其他几个案例中,游戏中也存在此类暂停。为此,我使用了一个NSTimer。

在......我有:

@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]:消息发送到解除分配的实例0x567640”)。由于计时器在完成后被释放,[scheduleTimer isValid]也会使应用程序崩溃。

现在我已经非常绝望,作为最后的手段,我正在考虑用UIView animateWithDuration替换计时器,它不会显示任何内容。

但是,我认为这应该是一个非常标准的情况。我只是不知道为什么我找不到这个非常明显的任务的答案。你能帮我吗?谢谢

2 个答案:

答案 0 :(得分:1)

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

所以你应该这样做:

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

您还应release

中的viewWillDisappear:计时器
[scheduleTimer release];

但更好的解决方案可能是使用dot属性语法来保留/释放:

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;
    }
}

答案 1 :(得分:0)

创建一个方法来使计时器失效,该计时器也将属性设置为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];