美文网首页📚苹果runtime
iOS之NSTimer使用和注意事项

iOS之NSTimer使用和注意事项

作者: 枫叶无处漂泊 | 来源:发表于2019-08-28 17:34 被阅读0次

iOS之NSTimer

前言

大家在开发的过程中,如果对NSTimer用的不是很熟悉的情况下,极有可能会发生循环引用导致内存无法释放。以及当界面互动的时候,NSTimer会停止,滑动停止会又计时的问题

NSTimer的使用方法

比较常用的两个方法:

+ (NSTimer *)timerWithTimeInterval:(NSTimeInterval)ti target:(id)aTarget 
selector:(SEL)aSelector 
userInfo:(nullable id)userInfo repeats:(BOOL)yesOrNo;

+ (NSTimer *)scheduledTimerWithTimeInterval:
(NSTimeInterval)ti target:(id)aTarget 
selector:(SEL)aSelector userInfo:
(nullable id)userInfo repeats:(BOOL)yesOrNo;

这两个方法都是创建一个定时器,第一方法创建需要之后,需要手动把添加Runloop中,不然不执行定时功能。第二方法不要自己加,系统自动加。例如:


NSTimer *timer = [NSTimer timerWithTimeInterval:3 target:self 
selector:@selector(timerAction) userInfo:nil repeats:YES];
// 加入RunLoop中
[[NSRunLoop mainRunLoop] addTimer:timer 
forMode:NSDefaultRunLoopMode];

当NSTimer加入到NSRunloop中的NSDefaultRunLoopMode模式会出现一个问题就是当页面有UICrollView滑动执行执行的模式是UITrackingRunLoopMode,NSDefaultRunLoopMode被挂起了,会导致定时器失效,等恢复为滑动结束时才恢复定时器。详情请了解ibireme的深入理解RunLoop文章。

需要定时器在 UIScrollView 滑动时也不影响的话,有两种解决方法:

  • 给NSTimer分别添加到UITrackingRunLoopMode 和 NSDefaultRunLoopMode这两个模式中:
[[NSRunLoop mainRunLoop] addTimer:timer 
forMode:NSDefaultRunLoopMode];
[[NSRunLoop mainRunLoop] addTimer:timer 
forMode: UITrackingRunLoopMode]; 
  • 给NSTimer添加NSRunLoop的NSRunLoopCommonModes中,平常用这中就可以了,比较简便来。
[[NSRunLoop mainRunLoop] addTimer:timer 
forMode: NSRunLoopCommonModes]; 

NSTimer新增的新方法

NSTimer在iOS10中推出了两个新的API,与上面的方法比较区别主要是selector换成Block回调,不过要是适配低版本还是尽量使用上面的两个方法。两个API如下:

+ (NSTimer *)timerWithTimeInterval:(NSTimeInterval)interval 
repeats:(BOOL)repeats block:(void (^)(NSTimer *timer))block 
API_AVAILABLE(macosx(10.12), 
ios(10.0), watchos(3.0), tvos(10.0));

+ (NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)interval repeats:
(BOOL)repeats block:(void (^)(NSTimer *timer))block 
API_AVAILABLE(macosx(10.12), ios(10.0), watchos(3.0), tvos(10.0));

这两个方法的区别和上面两个一样。

NSTimer释放

当NSTimer不需要了,需要释放NSTimer时,如下:

// 停止定时器
[timer invalidate];
timer = nil;

NSTimer总结

  • 使用NSTimer比较方便快捷。

  • 创建NSTimer必须加入到Runloop中才能生效
    创建NSTimer都是要加到Runloop中的,不管是手动添加还是系统添加。

  • 当Timer加入到runloop的模式的NSDefaultRunLoopMode,当UIScrollView滑动的时候会暂时失效

  • 使用NSTimer会存在延时,计时不是很准。因为不管是一次性的还是周期性的timer的实际触发事件的时间,都会与所加入的RunLoop和RunLoop Mode有关,

    • 如果此RunLoop正在执行一个连续性的运算,timer就会被延时出发。
    • 重复性的timer遇到这种情况,如果延迟超过了一个周期,则会在延时结束后立刻执行,并按照之前指定的周期继续执行,这个延迟时间大概为50-100毫秒.
    • NSTimer不是绝对准确的,而且中间耗时或阻塞错过下一个点,那么下一个点就pass过去了.
    • 在对时间准确精度不要求特别高的话,使用NSTimer定时器。

结尾

总结了NStimer基本使用方法和特点。希望大家能够具体操作一下,慢慢理解。

相关文章

  • iOS之NSTimer使用和注意事项

    iOS之NSTimer 前言 大家在开发的过程中,如果对NSTimer用的不是很熟悉的情况下,极有可能会发生循环引...

  • NSTimer

    深入NSTimer(iOS)iOS 中的 NSTimer关于NSRunLoop和NSTimer的深入理解

  • iOS NSTimer使用注意事项

    NSTimer 是系统提供的定时器,系统提供的api也比较简单,使用很方便,项目开发中会经常用到。然而,在使用NS...

  • ios中循环引用问题

    ios中循环引用问题 NO1: NSTimer 问题:当你创建使用NSTimer的时候,NSTimer会默...

  • 无标题文章

    iOS NSTimer使用详解-开启、关闭、移除 定时器定时器详解ios定时器关闭定时器NSTimer 1、要使用...

  • iOS NSTimer 和 GCD 定时器及封装

    iOS NSTimer 和 GCD 定时器及封装 iOS NSTimer 不准时 NSTimer 内部是有 run...

  • NSTimer使用注意事项

    ##NSTimer使用注意事项 http://www.cnblogs.com/qmmq/p/5282982.htm...

  • NSTimer和target之间的关系解除

    问题思考 NStimer最为iOS开发中最常见的定时器,使用简单方便,但是在处理NStimer和target相互引...

  • iOS NSTimer使用小结:

    NSTimer 是iOS开发中常用的定时器, NSTimer的使用常见的有两种方式: 1. [NSTimer t...

  • NSTimer循环引用的问题

    问题简介 在iOS中,NSTimer的使用非常频繁,但是NSTimer在使用中需要注意,避免循环引用的问题: 由于...

网友评论

    本文标题:iOS之NSTimer使用和注意事项

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