How to stop NSTimer

给你一囗甜甜゛ 提交于 2019-11-27 13:53:37
Suresh Varma

Use the below code. It will work But keep in mind that it must only be called if our timer is in running mode else the application will get crashed.

- (void)viewWillDisappear:(BOOL)animated {
    //BEFORE DOING SO CHECK THAT TIMER MUST NOT BE ALREADY INVALIDATED
    //Always nil your timer after invalidating so that 
    //it does not cause crash due to duplicate invalidate
       if(timer)
       {
         [timer invalidate];
         timer = nil;
       }
    [super viewWillDisappear:animated];
}

like this:

[yourtimername invalidate];

But be careful, you cant stop the timer if it's already stopped because your app will crash.

As iCoder says it has to be invalidated in viewWillDisappear.

I added the following just to make sure. it works for me. Hope it helps (and adds to icoders answer do not intent to copy)

- (void) startTimer
{
[self stopTimer];
timer = [NSTimer scheduledTimerWithTimeInterval: 5.0
                                                     target: self
                                                   selector:@selector(onTick)
                                                   userInfo: nil repeats:YES];

}

- (void) stopTimer
{
    if (timer) {
        [timer invalidate];
        timer = nil;
    }

}
user1045302

4 year old post, I know but maybe I can save the NEXT guy from wasting time trying invalidate a NSTimer. Apples documentation explains it and it works for me.

in .h

@property(nonatomic, retain) NSTimer *yourTimer;
@property(weak) NSTimer *repeatingTimer;

in .m

@synthesize yourTimer, repeatingTimer;

in viewDidLoad

yourTimer = [NSTimer scheduledTimerWithTimeInterval:(NSTimerInterval)(40.0/60.0)
                                             target:self
                                           selector:@selector(blink)
                                           userInfo:nil
                                            repeats:TRUE];

  self.repeatingTimer = yourTimer;

in my viewDidDisappear

   [repeatingTimer invalidate];
   repeatingTimer = nil;

the trick is in the assignment of the first NSTimer to (weak) NStimer object and killing THAT object.

You Could Use Two Different Things

    [timername invalidate];

Or You Could Use

    timername = nil;
Izac Mac

Trick is to use a singleton class, google myGlobals class which is mostly used as a singleton Although if u do wish to use NSTimer, then

lets say the view 1 is which u go into and view 2 is the one which u go back 2.

So in case of view 2, write the NSTimer to invalidate the timer in the viewDidLoad(Assuming you have two separate classes for both views).Problem will occur because when u go to view 1, the view 2 Timers will be dealloc. So, make a Singleton class and save the NSTimer pointer like this

//to be done in viewDidLoad function
theGlobals *globals = [theGlobals alloc] init];// for the singleton class to initiate,
[globals.myTimer invalidate];


//to be done in viewDidUnload
theGlobals *globals = [theGlobals alloc] init];// for the singleton class to initiate,
globals.myTimer = [NSTimer scheduledTimerWithTimeInterval: 5.0
                                                 target: self
                                               selector:@selector(onTick)
                                               userInfo: nil repeats:YES];

oh , and here is the myGlobals class code that u will need

//theglobals.h file

#import <Foundation/Foundation.h>


@interface theGlobals : NSObject 
{
    NSTimer *myTimer;
}

@property (nonatomic, copy) NSString *changeyes;



+(theGlobals*)sharedInstance;
@end

//implementaton .m file

#import "theGlobals.h"
@implementation theGlobals

@synthesize myTimer;



static theGlobals *sharedInstance;

- (id) init
{
return self;
}

+(theGlobals*)sharedInstance
{
if (!sharedInstance)
{
    sharedInstance = [[theGlobals alloc] init];
}
return sharedInstance;
}
@end

Just invalidate the timer

[timer invalidate];

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!