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