博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
NSTimer定时器使用
阅读量:4341 次
发布时间:2019-06-07

本文共 1372 字,大约阅读时间需要 4 分钟。

 

(一)定时器

  运用NSTimer类来创建定时器类,或者更简单的来说,就是定时器。定时器等待一个确定的时间间隔后,就会执行特定的消息给目标对象。例如可以创建一个NSTimer类发送消息给一个  window,告诉他在一个确定的时间间隔来update他自己。

  所以说定时器就是能够在接下来的时间执行或者周期执行方法的一个对象。

  那么问题来了,定时器未来的某一刻执行或者重复执行方法,如何保证那个时候我们要触发的方法还是有效的呢?

  其实timer都会对它的target进行retain。从而保证了timer调用时候的正确性,但是timer一直重复创建的,此时会出现内存泄露,就要有对应的invalidate。

  NSTimer其实也不是准时的。假设从现在开始3秒后在一个线程中执行定时器方法,但是这个线程当时有大量的运算,那么就必须等到运算结束才可以。所以说timer并不是一个实时的机制。是会出现延迟的。

  NSTimer创建后,要添加到runloop的对应mode中(一般defaultMode)。因为所有的事件都是在runloop中的。所以说必须把定时器加入到runLoop中才可以。schedu只是一个遍历方法,系统默认已经加入了运行循环。

  但是添加到运行循环后,也不一定执行。原因有两个。

  1.每一个线程都有自己的runLoop,主线程自己的runLoop是默认开启的,并且是个死循环。而子线程,自己新建的线程的的runLoop默认是关闭的,需要手动开启。

  2.RunLoopMode不正确。一般主线程就是DefaultMode,但是还有其他刷新表格,用于scrollView等上面的Mode。

(二)常用方法

  2.1 schedu:默认已经放到了运行循环并开启。

  2.2 timeWith:此方法要自己添加到运行循环并且fire

  

(三)定时器执行带参数的方法:传递参数会调用info消息。

- (void)ramdomAllTheTime {        // 定时器持续//    NSTimer *time = [NSTimer timerWithTimeInterval:0.5 target:self selector:@selector(change) userInfo:nil repeats:YES];    //    [[NSRunLoop currentRunLoop] addTimer:time forMode:NSDefaultRunLoopMode];    //    [time fire];        [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(change:) userInfo:@"11" repeats:YES];        }- (void)change:(NSTimer *)timer {        NSLog(@"%@",timer.userInfo);        [self setNeedsDisplay];}

 

转载于:https://www.cnblogs.com/aixiaoxin/p/4964261.html

你可能感兴趣的文章
阿里百川SDK初始化失败 错误码是203
查看>>
透析Java本质-谁创建了对象,this是什么
查看>>
BFS和DFS的java实现
查看>>
关于jquery中prev()和next()的用法
查看>>
一、 kettle开发、上线常见问题以及防错规范步骤
查看>>
eclipse没有server选项
查看>>
CRC码计算及校验原理的最通俗诠释
查看>>
使用Gitbook来编写你的Api文档
查看>>
jquery扩展 $.fn
查看>>
Markdown指南
查看>>
influxDB的安装和简单使用
查看>>
JPA框架学习
查看>>
JPA、JTA、XA相关索引
查看>>
机器分配
查看>>
php opcode缓存
查看>>
springcloud之Feign、ribbon设置超时时间和重试机制的总结
查看>>
观看杨老师(杨旭)Asp.Net Core MVC入门教程记录
查看>>
UIDynamic(物理仿真)
查看>>
Windows下安装Redis
查看>>
winform非常实用的程序退出方法!!!!!(转自博客园)
查看>>