美文网首页
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