如何检查 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的失效问题详解