如何检查NSTimer是否已经失效

我有一个NSTimer对象,如果用户点击button或者退出视图,我需要使其失效。

所以我有:

 [myNSTimer invalidate]; 

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

我试过了:

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

但是这并没有奏效。

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

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

通常我会做的是无论是持有定时器的成员variables,无论是当它触发,或者当我无效。 那么你可以做:

 [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() }