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]; });