如何检查 NSTimer 是不是自动失效?

Posted

技术标签:

【中文标题】如何检查 NSTimer 是不是自动失效?【英文标题】:How to check if NSTimer auto-invalidation has been made?如何检查 NSTimer 是否自动失效? 【发布时间】:2011-07-19 08:50:14 【问题描述】:

我在创建不重复的 NSTimer 时遇到问题。

假设我创建了一个新实例

timer = [NSTimer scheduledTimerWithTimeInterval:3.0 target:self selector:@selector(updateSystems) userInfo:nil repeats:NO];

在我的代码中的某个地方。

如果我按下 Iphone 上的主页按钮,我的应用程序将进入后台状态,并且计时器仍然存在,只是暂停。所以在我的applicationDidEnterBackground 方法中我说

if(timer.isValid == YES)

    [timer invalidate];
    timer = nil;

如果我在计时器完成后按下主页按钮,就会出现问题。然后定时器已经被释放,导致尝试访问isValid时崩溃。

尝试

if(timer != nil) 

    [timer invalidate];
    timer = nil;
 

导致同样的崩溃,因为 Cocoa 的自动失效似乎没有将计时器设置为 nil

如何检查计时器是否自动失效?

谢谢。

注意:我需要这样做的原因是因为我正在向 Web 服务发送请求,一旦请求成功(或失败),我就会启动一个计时器,一旦它被触发就会发送一个新请求.如果我在计时器完成之前不使计时器无效,则会创建多个计时器(因为我在 applicationDidBecomeActive 上发出新请求)在只需要一个时发出多个请求。

【问题讨论】:

【参考方案1】:

您需要自己保留计时器,以确保它在触发后仍然存在。 scheduledTimerWithTimeInterval 返回一个不属于你的自动释放实例。

【讨论】:

我不希望它还在,我只想检查它是否还在。 没有简单的方法可以确定指针是否仍然包含有效的objective-c 对象。保留计时器它是正确的方法。您应该始终保留以后要访问的对象,以防止在保留该对象的其他对象释放它时崩溃。 所以我应该保留计时器,然后检查保留计数是否大于 1,如果是,我知道尚未访问自动失效。仍然可能存在一些计时问题,因为计时器在不同的线程中运行。当我检查保留计数条件并且它说大于 1 时,仍然有可能在我根据我的条件执行操作之前运行自动失效? 没有。您应该释放计时器并在它触发后将其设置为 nil。 所以我可以保留它直到我创建一个新的计时器,但同样的事情可能会发生:如果我在释放和新计时器的新创建之间按下主页按钮,没有计时器会存在,再次导致进入 applicationDidEnterBackground 时崩溃。

以上是关于如何检查 NSTimer 是不是自动失效?的主要内容,如果未能解决你的问题,请参考以下文章

iOS - scrollView与NSTimer的失效问题详解

从NSTimer的失效性谈起:关于GCD Timer和libdispatch

如何在选择器成功之前调用 NSTimer [重复]

iOS开发中NSRunloop跟NSTimer的问题

手机自动旋转屏幕失效了啥情况

如何暂停/播放 NSTimer?