美文网首页
iOS-NSTimer 使用

iOS-NSTimer 使用

作者: 良人不归_墨染锦年 | 来源:发表于2018-05-13 17:59 被阅读0次

1.NSTimer的创建方法

// 创建一个定时器,但没有添加到运行循环,我们需要在创建定时器后手动的调用 NSRunLoop 对象的 addTimer:forMode: 方法。
+ (NSTimer *)timerWithTimeInterval:(NSTimeInterval)ti invocation:(NSInvocation *)invocation repeats:(BOOL)yesOrNo; 

// 创建一个timer并把它指定到一个默认的runloop模式中,并且在 TimeInterval时间后 启动定时器 
+ (NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)ti invocation:(NSInvocation *)invocation repeats:(BOOL)yesOrNo; 

// 创建一个定时器,但是么有添加到运行循环,我们需要在创建定时器后手动的调用 NSRunLoop 对象的 addTimer:forMode: 方法。
+ (NSTimer *)timerWithTimeInterval:(NSTimeInterval)ti target:(id)aTarget selector:(SEL)aSelector userInfo:(nullable id)userInfo repeats:(BOOL)yesOrNo; 

// 创建一个timer并把它指定到一个默认的runloop模式中,并且在 TimeInterval时间后 启动定时器 
+ (NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)ti target:(id)aTarget selector:(SEL)aSelector userInfo:(nullable id)userInfo repeats:(BOOL)yesOrNo;

// 默认的初始化方法,(创建定时器后,手动添加到 运行循环,并且手动触发才会启动定时器)
- (instancetype)initWithFireDate:(NSDate *)date interval:(NSTimeInterval)ti target:(id)t selector:(SEL)s userInfo:(nullable id)ui repeats:(BOOL)rep NS_DESIGNATED_INITIALIZER; 

2. NStimer的开启

// 启动 Timer 触发Target的方法调用,但并不会改变Timer的时间设置。 即 time没有到达到,Timer会立即启动调用方法且没有改变时间设置,当时间 time 到了的时候,Timer还是会调用方法。
- (void)fire;

// 设置定时器的启动时间,常用来管理定时器的启动与停止 
@property (copy) NSDate *fireDate; 

timer.fireDate = [NSDate distantPast];  // 开启定时器
timer.fireDate = [NSDate distantFuture]; // // 停止定时器
[timer setFireDate:[NSDate date]]; // 继续定时器

3. NStimer的停止

// 获取定时器是否有效
@property (readonly, getter=isValid) BOOL valid;
// 停止 Timer,即将定时器设置成无效 ---> 将定时器从循环池中移除
- (void)invalidate;

4. NStimer的其他属性

// 这个是一个只读属性,获取定时器调用间隔时间
@property (readonly) NSTimeInterval timeInterval;

// 这是7.0之后新增的一个属性,因为NSTimer并不完全精准,通过这个值设置误差范围
@property NSTimeInterval tolerance NS_AVAILABLE(10_9, 7_0);

5. NStimer的内存释放

如果我们启动了一个定时器,在某个界面释放前,将这个定时器停止,甚至置为nil,都不能使这个界面释放,原因是系统的循环池中还保有这个对象。

6. NStimer使用注意

参数repeats是指定是否循环执行,YES将循环,NO将只执行一次。

timerWithTimeInterval这两个类方法创建出来的对象如果不用 addTimer: forMode方法手动加入主循环池中,将不会循环执行。

scheduledTimerWithTimeInterval 这两个方法会将定时器添加到当前的运行循环,运行循环的模式为默认模式。如果需要第一次就执行一次,需要调用开启定时器的方法。

init方法需要手动加入循环池,它会在设定的启动时间启动。

在页面释放前先释放定时器。

7.NSTimer为什么需要在RunLoop中才会有作用

NSTimer其实也是一种事件,而所有的source(事件)如果要起作用,必须添加到runloop中,并且此runloop是有效的,并运行着。

同理timer这种source(事件)要想起作用,那肯定也需要加到runloop中才会有效。

如果一个runloop里面不包含任何source(事件)的话,运行该runloop时会处于一种休眠状态等待下一个事件。所以如果创建了timer但是不添加runloop的话,timer资源处于一种闲置等待状态。

//创建timer
_requestTimer = [NSTimer scheduledTimerWithTimeInterval:requestInterval target:self selector:@selector(requestDriverPosition) userInfo:nil repeats:YES];
// 启动timer
_requestTimer.fireDate = [NSDate distantPast];  


//移除timer
- (void)removeTimer {
    if (_requestTimer) {
    //停止定时器
        _requestTimer.fireDate = [NSDate distantFuture];
        [_requestTimer invalidate];
        _requestTimer = nil;
    }
}

相关文章

  • iOS-NSTimer 使用

    1.NSTimer的创建方法 2. NStimer的开启 3. NStimer的停止 4. NStimer的其他属...

  • iOS-NSTimer()

    NSTimer 每隔一定时间执行某个函数 //创建定时器//参数1.定时时间//参数2.调用方法的对象//参数3....

  • iOS-NSTimer

    NSTimer是iOS常见定时器。它经过特定时间间隔就会触发,将指定的消息发送到目标对象。定时器是线程通知自己做某...

  • iOS-NSTimer强引用

    当使用如上代码创建一个NSTimer之后会出现一个VC-> NSTimer->VC的循环引用。导致界面不能释放。 ...

  • iOS-NSTimer释放的三种方式

    一开始在使用NSTimer的时候,会发现出现了循环引用。 出现循环引用是因为 将一个NSTimer的对象作为一个V...

  • iOS-NSTimer不同创建方式的区别

    先说总结 创建NSTimer必须加入到Runloop中才能生效,不管是手动添加还是系统添加。 当Timer加入到r...

  • iOS-NSTimer真的没有想象中的简单:NSInvocati

    在iOS开发当中,无可避免的会涉及到定时任务,比如在发送验证码时的倒计时: 小编相信每个人都遇到过这样的需求,都很...

  • 使用使用

    1234546464

  • C++ STL 练手(vector的使用)

    vector的使用 list的使用 deque的使用 set的使用 map的使用 multiset的使用 mult...

  • C++ STL 练手(multimap的使用)

    vector的使用 list的使用 deque的使用 set的使用 map的使用 multiset的使用 mult...

网友评论

      本文标题:iOS-NSTimer 使用

      本文链接:https://www.haomeiwen.com/subject/oqwldftx.html