XcodeMania
XcodeMania

Reputation: 305

NSTimer not stopping?

I'm trying to to stop an NSTimer with the following code:

- (void)viewDidLoad
{
    [super viewDidLoad];
    timer3 = [NSTimer timerWithTimeInterval:5.0 target:self selector:@selector(start) userInfo:nil repeats:YES];
    [[NSRunLoop mainRunLoop] addTimer:timer3 forMode:NSDefaultRunLoopMode];
}

-(void)invalidate
{  
    [timer3 invalidate];
    timer3 = nil; 
}

and I call -(void)invalidate from another class like this:

-(void)timer
{
    ClassOfMyTimer *class = [[ClassOfMyTimer alloc] init];
    [class invalidate];
}

but the timer doesn't stop. Does anyone know what I'm doing wrong?

Upvotes: 2

Views: 1492

Answers (2)

Jeff Hellman
Jeff Hellman

Reputation: 2117

I'm kind of confused by what you're trying to do here, but I'd guess that you're not maintaining a reference to timer3.

Have you created a property in the .h file for the timer:

@property (strong) NSTimer *timer3;

And then added a synthesize statement in the .m file:

@synthesize timer3;

Then, in viewDidLoad:, you can maintain a reference to the timer you're creating via:

self.timer3 = [[[NSTimer timerWithTimeInterval:5.0 target:self selector:@selector(start) userInfo:nil repeats:YES];

[[NSRunLoop mainRunLoop] addTimer:self.timer3 forMode:NSDefaultRunLoopMode];

And, to invalidate the timer later:

[self.timer3 invalidate]
self.timer3 = nil

On preview, Sven also has a valid solution to an issue that might be impacting you..

Upvotes: 1

anon
anon

Reputation:

You need to call your invalidate method on the same instance of your class that created the timer. In your timer method you create a new instance of your class which could have its own timer and invalidate that.

Upvotes: 4

Related Questions