NSTimer不停止

我有一个计时器,当viewWillAppear方法被调用时触发,并在viewDidDisappear方法时失效。 但是在一定数量的视图之间切换之后,定时器即使在无效之后也会继续点亮。 有什么问题?

这是我的代码:

 NSTimer *timer; - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; timer = [NSTimer scheduledTimerWithTimeInterval: 0.2f target: self selector:@selector( timerAction ) userInfo:nil repeats:YES]; } -(void)viewDidDisappear:(BOOL)animated { [super viewDidDisappear:animated]; [timer invalidate]; timer = nil; } -(void) timerAction { NSLog(@"timerAction"); } 

我应该保留一个链接到计时器。 🙂 5个月前我已经问过这个问题了,这真是太棒了,我获得了多less经验。 🙂

 timer = [ [NSTimer scheduledTimerWithTimeInterval: ...] retain]; ... ... [timer invalidate]; [timer release]; 

这是一个绝对的解决scheme。 以上都没有为我工作,所以我做到了这一点,

你想在哪里启动计时器,

 [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(timerMethod) userInfo:nil repeats:NO]; 

定时器调用的方法,

 -(void)timerMethod { // do what you need to do if (needs to be called again) { [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(timerMethod) userInfo:nil repeats:NO]; } } 

希望这可以帮助,

定时器调用的方法应该有定义

 - (void)methodName:(NSTimer *)aTimer; 

这样的方法有定时器的实例被解雇。 你这样做的方法,将不知道计时器是否失效。

尝试改变你的计时器初始化

 timer = [NSTimer scheduledTimerWithTimeInterval: 0.2f target: self selector:@selector(timerAction:) userInfo:nil repeats:YES] 

和方法

 -(void) timerAction:(NSTimer *)aTimer{...} 

希望有所帮助

这可能不是问题,但是您需要保留从scheduledTimerWithInterval:返回的定时器的引用。 如果不这样做,那么当你停止它的时候,你指向定时器的指针可能是无效的。

 - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; timer = [[NSTimer scheduledTimerWithTimeInterval:0.2f target:self selector:@selector(timerAction) userInfo:nil repeats:YES] retain]; } - (void)viewDidDisappear:(BOOL)animated { [timer invalidate]; [timer release]; timer = nil; [super viewDidDisappear:animated]; } - (void)dealloc { [timer invalidate]; [timer release]; timer = nil; [super dealloc]; } 

此外,尝试在viewDidDisappear中设置断点,并确保它被调用!

 **In .h class** @interface { NSTimer * theTimer; } **in .m class** //put this code where you want to calling the NSTimer function theTimer = [NSTimer scheduledTimerWithTimeInterval:1.0f target:self selector:@selector(updateCounter:) userInfo:nil repeats:YES]; - (void)updateCounter:(NSTimer *)theTimer { // write your code here for counter update } // put this code to Stop timer: [theTimer invalidate]; theTimer = nil; 

这对我来说在Swift中诀窍

 override func viewWillDisappear(animated: Bool) { super.viewWillDisappear(animated) dispatch_async(dispatch_get_main_queue(),{ [weak self] in self?.idleTimer?.invalidate() self?.idleTimer = nil }) } 

您已经忘记在viewWillDisappear:释放计时器viewWillDisappear:

 - (void)viewDidDisappear:(BOOL)animated { [super viewDidDisappear:animated]; [timer invalidate]; [timer release]; timer = nil; } 

这应该不会导致计时器继续开火,但…

doco说invalidate

“运行循环删除并释放计时器,无论是在无效方法返回之前,还是在稍后的时间点。”

我想你的稍后会被删除。

我有同样的问题。

如果计时器仍在运行,我不能解除分配实例,所以我必须在调用之前停止它:

 - (void)stopTimer { [timer invalidate]; [timer release]; timer = nil; } 

调用这个方法后,我的计时器真的停止

- (void)viewWillAppear:(BOOL)animated被再次调用。

事实上,每当您切换视图时或在您解散模态视图后都会调用它。 基本上任何时候你的观点都会重新出现在屏幕上,而不仅仅是第一次。

所以在这种情况下,定时器会重新启动,即使之前是无效的。

创build你的计时器后,只需注册它在NSRunLoopCommonModes运行:

[[NSRunLoop currentRunLoop] addTimer:myTimer forMode:NSRunLoopCommonModes];

然后invalidate方法将工作。

这对我有用

 dispatch_async(dispatch_get_main_queue(), ^{ [timer invalidate]; });