I've got a timer which fires when the viewWillAppear
method is being called and invalidates when the viewDidDisappear
method is being called. But after a certain amount of switching between views the timer continues firing even after it was invalidated. What's the problem?
Here is my code:
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");
}
I should have been keeping a link to the timer by retaining it. :) I've asked this question 5 months ago, and it's amazing, how much more experience I acquired. :)
timer = [ [NSTimer scheduledTimerWithTimeInterval: ...] retain];
...
...
[timer invalidate];
[timer release];
This is an absolute solution. None of the ones above worked for me, so I did this,
where you want to start the timer,
[NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(timerMethod) userInfo:nil repeats:NO];
The method that the timer calls,
-(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];
}
}
hope this helps,
A method called by a timer should have the definition
- (void)methodName:(NSTimer *)aTimer;
This way the method has the instance of timer which was fired. The way you are doing it, the method will not know whether the timer was invalidated or not.
Try changing your timer initialization to
timer = [NSTimer scheduledTimerWithTimeInterval: 0.2f target: self selector:@selector(timerAction:) userInfo:nil repeats:YES]
and the method to
-(void) timerAction:(NSTimer *)aTimer{...}
Hope that helps
This may not be the issue, but you need to retain the reference to timer that is returned from scheduledTimerWithInterval:. Without doing this, your pointer to the timer might be invalid by the time you go to stop it.
- (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];
}
Also, try setting a breakpoint in viewDidDisappear and make sure it's getting called!
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With