一、NSTimer认识
NSTimer其实是将一个监听加入到系统的RunLoop中去,当系统runloop到如何timer条件的循环时,会调用timer一次,当timer执行完,也就是回调函数执行之后,timer会再一次的将自己加入到runloop中去继续监听。
一个timer对象在同一时间只能够被注册到一个runloop中,尽管在这个runloop中它能够被添加到多个runloop模式中去。
二、NSTimer使用
有以下三种初始化方法:
使用scheduledTimerWithTimeInterval: invocation: repeats:或者scheduledTimerWithTimeInterval: target: selector: userInfo: repeats:这两个类方法创建一个timer并把它指定到一个默认的runloop模式中
使用timerWithTimeInterval: invocation: repeats:或者timerWithTimeInterval: target: selector: userInfo: repeats: 这两个类方法创建一个timer的对象 (当创建之后,你必须手动的调用NSRunLoop下对应的方法addTimer:forMode:去将它制定到一个runloop模式中)。
使用initWithFireDate: interval: target: selector: userInfo: repeats: 方法分配并创建一个NSTimer的实例(当创建之后,你必须手动的调用NSRunLoop下对应的方法addTimer:forMode:去将它制定到一个runloop模式中)。
[timer fire];//可以通过fire这个方法去触发timer,即使timer的firing time没有到达
注意:不用scheduled方式初始化的,需要手动addTimer: forMode: 将timer添加到一个runloop中。而scheduled的初始化方法将以默认mode直接添加到当前的runloop中。
以下是一个采用scheduled的初始化方法的60秒倒计时定时器的初始化:
_countDownTimer= [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(timeFireMethod) userInfo:nil repeats:YES];
将计数器的repeats设置为YES时,self的引用计数会加1。因此可能会导致self(即viewController)不能release,所以,必须在viewWillAppear的时候,将计数器timer停止,否则可能会导致内存泄露。
停止的方法为:[self.countDownTimer invalidate];
- (void)invalidate是唯一一个可以将计时器从runloop中移出的方法。