如何检查NSTimer是否已经失效

问题描述:

我有一个NSTimer对象,如果用户点击一个按钮或者他们退出视图,我需要使其无效。如何检查NSTimer是否已经失效

所以我必须:

[myNSTimer invalidate]; 

在我的按钮处理程序和内部viewWillDisappear。如果用户点击按钮然后存在一个视图,则该应用程序会抛出异常,因为myNSTimer已经失效。 我在viewWillDisappear方法中需要做的是检查myNSTimer是否已失效。我怎么做?

我已经试过:

if(myNSTimer != nil) 
    [myNSTimer invalidate]; 

,但没有奏效。

一旦你使计时器失效,只需在其上调用release(假设你保留了你所持有的参考),然后删除你的参考。这样,当你退出视图时,第二次尝试使定时器无效将仅在nil上调用该方法,而不执行任何操作。

或者,您可以使用-[NSTimer isValid]在无效之前检查它是否有效,但是无论如何,在无效之后无效保留您的引用是没有任何理由的。另外,如果你真正的问题是你没有保留你的参考,所以第一个-invalidate实际上留给你一个参考指向一个释放的对象,然后调用-isValid无论如何不会有帮助。

+0

谢谢您的回答! – 2008-12-16 03:50:33

我通常会做的事情是剔除持有计时器的成员变量,无论是何时触发,还是无效。那么你可以这样做:

[myNSTimer invalidate]; 
myNSTimer = nil; 

它会做正确的事情。

我在尝试暂停时遇到了同样的问题&重新启动计时器。要停止它:

[timer invalidate]; 
[timer release]; 
timer = nil; 

,并启动/重新启动:

timer = [[NSTimer scheduledTimerWithTimeInterval:3 target:self selector:@selector(aSelector) userInfo:nil repeats:YES] retain]; 

现在,当我使它无效它不会崩溃。

斯威夫特:

if timer.valid { 
    timer.invalidate() 
}