12

NSTimer如果用户点击按钮或退出视图,我需要使对象无效。

所以我有:

[myNSTimer invalidate];

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

我试过了:

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

但这没有用。

4

4 回答 4

33

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

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

于 2008-12-15T12:47:43.693 回答
6

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

[myNSTimer invalidate]; 
myNSTimer = nil;

它会做正确的事。

于 2008-12-15T13:38:21.830 回答
3

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

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

并启动/重新启动它:

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

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

于 2012-10-11T08:40:22.310 回答
1

迅速:

if timer.valid {
   timer.invalidate()
}
于 2016-04-19T23:13:31.113 回答