美文网首页
iOS开发:NSTimer,计时器的使用

iOS开发:NSTimer,计时器的使用

作者: 小样别嘚瑟 | 来源:发表于2019-11-28 11:59 被阅读0次

原文来自: https://blog.csdn.net/CC1991_/article/details/81070986

一、NSTimer的初始化创建

        1、初始化计时器

    (1)官方API的两个方法:

    + (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;

        注意:不用scheduled方式初始化的,需要手动addTimer:forMode: 将timer添加到一个runloop中;而有scheduled的初始化方法将可以默认mode直接添加到当前的runloop中。

    (2)具体实例如下所示:

    @property (nonatomic, strong) NSTimer *timer; //声明计时器属性

    方法一:

    self.timer = [NSTimer timerWithTimeInterval:5*60 target:self selector:@selector(printNum) userInfo:nil repeats:YES];

      [[NSRunLoop currentRunLoop] addTimer:self.timer forMode:NSDefaultRunLoopMode];

    方法二:

    self.timer = [NSTimer scheduledTimerWithTimeInterval:5*60 target:self selector:@selector(printNum) userInfo:nil repeats:YES]; //初始化一个5分钟执行一次的计时器

tableView滑动时,加入 [[NSRunLoop currentRunLoop] addTimer:self.timer forMode:NSDefaultRunLoopMode];,不然,计时器会出现卡顿等其他现象

 NSTimer初始化方法一,里面没有scheduled,所以必须要手动addTimer:,将timer添加到runloop中;方法二中有scheduled的初始化方法,将以默认的mode把timer添加到当前的runloop中。

        二、计时器触发操作

        当定时器创建完(不用scheduled的)添加到runloop中后,该定时器将在初始化时指定的timeInterval秒后自动触发,可以使用-(void)fire;方法来立即触发该定时器。

       在重复执行的定时器中调用这个方法后会立即触发该定时器,但不会中断其之前的执行计划。在不重复执行的定时器中调用此方法,立即触发后,就会使这个定时器失效。

         三、计时器停止操作

         NSTimer的停止操作只有一种方法可以将timer移除runloop,具体操作如下所示:

         [self.timer invalidate]; //停止计时器的方法

         self.timer = nil;   //为了防止意外,还是要把它赋值为nil的

       由于计时器NSTimer会保留目标对象,等到它自身失效时再释放这个对象。调用invalidate方法可令计时器失效;执行完相关任务后,一次性的计时器也会失效。如果将计时器设置成重复执行的模式,那么必须要自己手动调用invalidate方法,才能令其停止。但是由于计时器会保留它的目标对象,所以反复执行任务会导致程序出问题,也就是说设置成重复执行模式的那种计时器,容易形成“引用循环”,因此在这种情况下,一定要记得调用终止计时器的invalidate方法才行。

    四、使用计时器需要注意的地方

    1、倒计时的时间间隔(时间单位是秒,可以精确到50-100毫秒);

    2、指定的执行方法;

    3、实现指定执行方法的对象;

    4、是否重复执行;

    5、使用方法" invalidate "进行停止;

    6、将对象设置为" nil “;

    7、特别是在返回到其他视图控制器的时候,要在" - (void)viewWillDisappear:

     (BOOL)animated "方法中(特别注意:不能在" - (void)dealloc”方法中设置)将timer停止,并设置为nil。

相关文章

网友评论

      本文标题:iOS开发:NSTimer,计时器的使用

      本文链接:https://www.haomeiwen.com/subject/mzbphxtx.html