如何检查NSTimer是否已经失效

时间:2008-12-15 12:43:11

标签: ios objective-c iphone cocoa-touch nstimer

我有一个NSTimer对象,如果用户点按某个按钮或退出视图,我需要使该对象无效。

所以我有:

[myNSTimer invalidate];

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

我试过了:

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

但这没效果。

4 个答案:

答案 0 :(得分:33)

一旦你使计时器无效,只需在它上面调用release(假设你保留了你所持有的引用),然后取消你的引用。这样,当您退出视图时,尝试再次使计时器失效,只会在nil上调用该方法,而不执行任何操作。

或者,您可以使用-[NSTimer isValid]在无效之前检查它是否有效,但是在第一次无效之后,确实没有理由保留您的引用。另外,如果你真正的问题是你没有保留你的引用,那么第一个-invalidate实际上会留下一个指向已发布对象的引用,那么调用-isValid无论如何都无济于事。 / p>

答案 1 :(得分:6)

我通常做的是将持有计时器的成员变量清零,无论是在它触发时,还是在我使其无效时。然后你可以这样做:

[myNSTimer invalidate]; 
myNSTimer = nil;

它会做正确的事。

答案 2 :(得分:3)

当我试图暂停时,我遇到了同样的问题。重启计时器。要阻止它:

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

启动/重新启动它:

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

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

答案 3 :(得分:1)

斯威夫特:

if timer.valid {
   timer.invalidate()
}