我有一个NSTimer
对象,如果用户点按某个按钮或退出视图,我需要使该对象无效。
所以我有:
[myNSTimer invalidate];
在我的按钮处理程序内部和viewWillDisappear
内部。如果用户点击按钮然后存在视图,则应用会抛出异常,因为myNSTimer
已经失效。
我需要在viewWillDisappear
方法中检查myNSTimer
是否已失效。我该怎么做?
我试过了:
if(myNSTimer != nil)
[myNSTimer invalidate];
但这没效果。
答案 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()
}