IOS开发中,定时器很经常用到,但实际开发中,我们常常会在使用过程中不注意使用时CPU内存持续占用,程序执行完定时器未关闭等问题。
所以,就整理了一下关于定时器的相关内容。
/**
* 相关参数
*
* @param TimeInterval 只读属性 获取定时器调用间隔时间(重复执行时)
* @param invocation 一个定时器调用对象
* @param repeats 指定是否循环执行该定时器,NO将只执行一次 YES时每次invalidate后重新执行。
* @param target 当前由哪个控制器来调用执行(self)
* @param selector 定时器调用什么方法
* @param userInfo 获取定时器参数信息
* @param FireDate 设置定时器的启动时间(NSDate) 常用于定时器的启动与停止
*/
初始化方法:定时器的初始化方法就是定时器的调用过程,共有5种。
+ (NSTimer *)timerWithTimeInterval:(NSTimeInterval)ti invocation:(NSInvocation *)invocation repeats:(BOOL)yesOrNo;
EG:
//初始化一个Invocation对象
NSInvocation * invo = [NSInvocation invocationWithMethodSignature:[[self
class
] instanceMethodSignatureForSelector:@selector(init)]];
[invo setTarget:self];
[invo setSelector:@selector(myLog)];
NSTimer * timer = [NSTimer timerWithTimeInterval:1 invocation:invo repeats:YES];
//加入主循环池中
[[NSRunLoop mainRunLoop]addTimer:timer forMode:NSDefaultRunLoopMode];
//开始循环
[timer fire];
<span style="font-family: Arial, Helvetica, sans-serif;">+ (NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)ti invocation:(NSInvocation *)invocation repeats:(BOOL)yesOrNo;</span>
<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">EG: </span><span style="font-family: Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace; font-size: 12.5px; line-height: 13.75px; background-color: rgb(255, 255, 255);">NSTimer * timer = [NSTimer scheduledTimerWithTimeInterval:1 invocation:invo repeats:YES];</span>
+ (NSTimer *)timerWithTimeInterval:(NSTimeInterval)ti target:(id)aTarget selector:(SEL)aSelector userInfo:(nullable id)userInfo repeats:(BOOL)yesOrNo;
EG:
NSTimer * timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(myFuction:) userInfo:@
"123"
repeats:YES];
<span style="font-family: Arial, Helvetica, sans-serif;">+ (NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)ti target:(id)aTarget selector:(SEL)aSelector userInfo:(nullable id)userInfo repeats:(BOOL)yesOrNo;</span>
- (instancetype)initWithFireDate:(NSDate *)date interval:(NSTimeInterval)ti target:(id)t selector:(SEL)s userInfo:(nullable id)ui repeats:(BOOL)rep NS_DESIGNATED_INITIALIZER;
EG:
NSTimer * timer = [[NSTimer alloc]initWithFireDate:[NSDate distantPast] interval:1 target:self selector:@selector(myFuction:) userInfo:nil repeats:YES];
[[NSRunLoop mainRunLoop]addTimer:timer forMode:NSDefaultRunLoopMode];
特别的:
1、不用scheduled方式初始化的,需要手动addTimer:forMode: 将timer添加到一个runloop中。
而scheduled的初始化方法将以默认mode直接添加到当前的runloop中.
2、scheduledTimerWithInterval这两个方法不需要手动调用fire即可自动加入主循环池执行。3、init方法需要手动加入循环池,他会在设定的启动时间启动。
使用结束,我们必须将定时器关闭,回收,退出RunLoop。 [timer invalidate];是唯一的将定时器从循环池中溢出的方法。
常使用的方法:
if
(timer.isValid) {
[timer invalidate];
}
timer=nil;
}
- (void)viewWillDisappear:(BOOL)animated ;中,当当前调用界面将要释放时,移除释放该定时器。
PS:
NSTimer可以精确到50-100毫秒.
NSTimer不是绝对准确的,而且中间耗时或阻塞错过下一个点,那么下一个点就直接略过了.