我们在开发的过程中,可能会用到计时器,Foundation框架中有个类叫做NSTimer。我们可以指定绝对的日期与时间,也可以指定执行任务的相对延迟时间,还可以重复运行任务,下面我们来看一下NSTimer的使用。
计时器要和“运行循环”相关联,运行循环到时候会触发任务。创建NSTimer时,可以将其“预先安排”在当前的运行循环中,也可以先创建好,然后由开发者自己来调度。不管何种方式,只有把计时器放在运行循环里,计时器才能正常触发任务。
代码如下,计时器的初始化
情况一:
NSTimer *timer = [NSTimer timerWithTimeInterval:5 target:self selector:@selector(printName) userInfo:nil repeats:YES];
[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode];
情况二:
NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:5 target:self selector:@selector(printName) userInfo:nil repeats:YES];
第一种初始化方法,没有scheduled,所以必须手动addTimer:,将timer添加到runloop中;第二种有scheduled的初始化方法,将以默认的mode将timer添加到当前的runloop中。
如果不想在当前的runloop中,执行timer方法,可以自己新建一个runloop。
NSRunLoop *loop = [NSRunLoop currentRunLoop];
[loop run];
计时器的停止
只有一种方法可以将timer移除runloop。
[timer invalidate];
因为计时器NSTimer会保留目标对象,等到自身失效时再释放此对象。调用invalidate方法可令计时器失效;执行完相关任务后,一次性的计时器也会失效。如果将计时器设置成重复执行模式,那么必须自己手动调用invalidate方法,才能令其停止。
由于计时器会保留其目标对象,所以反复执行任务通常会导致程序出问题。也就是说,设置成重复执行模式的那种计时器,容易形成“引用循环”。所以这种情况下,一定要记得调用终止计时器的invalidate方法。