如何检查 NSTimer 是否已经失效

How to check if NSTimer has been already invalidated

提问人:subjective-c 提问时间:12/15/2008 最后编辑:iDevelopersubjective-c 更新时间:5/16/2016 访问量:18094

问:

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

所以我有:

[myNSTimer invalidate];

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

我试过:

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

但这没有用。

iOS Objective-C iPhone Cocoa-Touch NSTimer

评论


答:

33赞 Lily Ballard 12/15/2008 #1

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

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

评论

0赞 H6_ 5/10/2011
这正是我问题的解决方案。谢谢。message sent to deallocated instance
6赞 Ben Gottlieb 12/15/2008 #2

我通常做的是,在触发计时器时或使计时器失效时,对持有计时器的成员变量进行清零。然后你可以做:

[myNSTimer invalidate]; 
myNSTimer = nil;

它会做正确的事情。

3赞 Yunus Nedim Mehel 10/11/2012 #3

当我尝试暂停和重新启动计时器时,我遇到了同样的问题。要停止它,请执行以下操作:

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

并启动/重新启动它:

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

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

1赞 Crashalot 4/20/2016 #4

迅速:

if timer.valid {
   timer.invalidate()
}