NSTimer 定时器的应用

      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不是绝对准确的,而且中间耗时或阻塞错过下一个点,那么下一个点就直接略过了.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值