在开发过程中,有时我们会需要用到计时或者是重复执行某个事件的功能。比如说,在手机发送验证码的功能当中的倒计时功能,每隔3s图片自动跳转的功能等。这时,我们可以使用NSTimer 定时器。
在NSTimer 类当中,主要提供了以下方法:
+ (NSTimer *)timerWithTimeInterval:(NSTimeInterval)ti invocation:(NSInvocation *)invocation repeats:(BOOL)yesOrNo;
+ (NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)ti invocation:(NSInvocation *)invocation repeats:(BOOL)yesOrNo;
+ (NSTimer *)timerWithTimeInterval:(NSTimeInterval)ti target:(id)aTarget selector:(SEL)aSelector userInfo:(id)userInfo repeats:(BOOL)yesOrNo;
+ (NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)ti target:(id)aTarget selector:(SEL)aSelector userInfo:(id)userInfo repeats:(BOOL)yesOrNo;
- (instancetype)initWithFireDate:(NSDate *)date interval:(NSTimeInterval)ti target:(id)t selector:(SEL)s userInfo:(id)ui repeats:(BOOL)rep NS_DESIGNATED_INITIALIZER;
- (void)fire;
- (void)invalidate;
在使用时,如果是非schedule方式初始化的NSTimer实例,需要用- (void)addTimer:(NSTimer *)timer forMode:(NSString *)mode方法,将实例加入到RunLoop当中。
使用方式:
NSTimer *_timer = [NSTimer scheduledTimerWithTimeInterval:1.0f target:self selector:@selector(popToPreViewController) userInfo:nil repeats:NO];
说明:
当repeats设为YES时,self将会对_timer实例的引用计数+1,所以,当_timer 停止后,一定要将其制空,否则_timer是不会被释放的。
方法中,是不会去执行的,也就是说该计时器永远不会被释放。所以计时器停止的方法可以放在
TimeInterval:间隔时间
target:发送对象
selector:执行的方法
userInfo:此参数可以为nil,当定时器失效时,由你指定的对象保留和释放该定时器
repeats:是否重复执行,设为YES时,则每隔1.0s 执行 popToPreViewController方法
计时器停止:
[_timer invalidate];
_timer = nil;
当repeats设为YES时,self将会对_timer实例的引用计数+1,所以,当_timer 停止后,一定要将其制空,否则_timer是不会被释放的。
在使用的过程中,我们可能会在一个页面初始化的时候开启定时器,在页面关闭的时候停止,如果将
[_timer invalidate];
_timer = nil;
放在
- (void)dealloc
方法中,是不会去执行的,也就是说该计时器永远不会被释放。所以计时器停止的方法可以放在
- (void)viewDidDisappear:(BOOL)animated
方法中,这样就可以将其释放掉。
NSTimer 定时器是准时的吗?
答案是否定的。
当线程空闲时,NSTimer是比较准时的,但是当线程进行大量的操作时,定时器实际被触发的时间就会向后拖。
所以如果需要精准计时时,NSTimer并不一定适用。