Brandon
Brandon

Reputation: 2171

Stop NSTimer Keeps Increasing Intervals

I have a strange issue with my countDown timer. This timer is counts down from a set time (i.e. 60 seconds). This bit of code is placed in myViewDidLoad method. Everything works unless I go back and load the view again. Every time the view loads, there is an increment of 1 second in the countdown.

For example:

  1. First Load: 60, 59, 58...
  2. Second Load: 60, 58, 56...
  3. Third Load: 60, 57, 54...

My code is below. Does anyone know why this is happening? Do I need to release something somewhere? Thank you!

countDown=[NSTimer scheduledTimerWithTimeInterval:1.0 target:self 
selector:@selector(TimeOver) userInfo:nil repeats:YES];

Upvotes: 1

Views: 324

Answers (1)

jscs
jscs

Reputation: 64002

Each time your view loads, you create a new timer, but the old ones still exist. In your timer's action method, TimeOver, you are decrementing an index variable that keeps track of the seconds, and each timer runs that method every time it fires. So, if you have three timers, the index will decrease by three each time.

You need to either not create new a new timer whenever your view loads or, better, destroy the timer when your view disappears:

[countDown invalidate];
countdown = nil;

and recreate it when it reappears.

Also, be aware that your timer's action method has an incorrect signature. It should be a method which returns nothing and takes one argument, which is the timer itself, like so:

- (void)timeOver: (NSTimer *)tim;

Also, Cocoa methods should not start with capital letters.

Upvotes: 6

Related Questions