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

原文来自: 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。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 定时器的用法 系统提供了8个创建方法,6个类创建方法,2个实例初始化方法。有三个方法直接将timer添加到...
    gpylove阅读 5,773评论 1 3
  • iOS中计时器常用的有两种方式 使用NSTimer类(Swift 中更名为 Timer) NSTimer 常用的初...
    superDg阅读 5,839评论 0 1
  • NSTimer 是系统提供的定时器,系统提供的api也比较简单,使用很方便,项目开发中会经常用到。然而,在使用NS...
    恋空K阅读 9,502评论 0 13
  • 这篇文章主要整理一下面试中会问到的一个知识点:几种计时器的知识点(一)NSTimer1.什么是NSTimer?官方...
    329fd8af610c阅读 5,248评论 0 0
  • 再一次面试中被问到nstimer的争取使用方法,原理,我当时就说了[_timer invalidate],time...
    iOS开发小平哥阅读 9,539评论 1 13

友情链接更多精彩内容