繁体   English   中英

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

[英]How to stop an NSTimer that I don't know is released or not

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

问题是这样的:在游戏过程中,用户回答一个问题和下一个问题之间存在停顿。 同样在其他几种情况下,游戏中也会出现这种暂停。 为此,我使用一个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无效]:消息发送到已释放实例0x567640”)。 由于计时器是在完成后释放的,因此[scheduleTimer isValid]也将使应用程序崩溃。

现在我已经非常绝望了,作为最后的选择,我正在考虑将计时器替换为不可见的UIView animateWithDuration。

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

我认为问题在于,在使NSTimer invalidate之前,它会自动释放。

因此,您应该执行以下操作:

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

并且您还应该在viewWillDisappear: 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;
    }
}

创建使计时器无效的方法,该方法还将属性设置为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];

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM