阅读 64

NSTimer定时器

1. NSTimer的文档定义

You use the NSTimer class to create timer objects or, more simply, timers. A timer waits until a certain time interval has elapsed and then fires, sending a specified message to a target object.

Timers work in conjunction with run loops. To use a timer effectively, you should be aware of how run loops operate.

Note in particular that run loops maintain strong references to their timers, so you don’t have to maintain your own strong reference to a timer after you have added it to a run loop.

大概意思就是:

  • 定时器在等待某个时间之后,响应事件,给目标发送消息.
  • 熟练使用定时器的前提是 了解运行循环的机制
  • 设置定时器,一定要添加到运行循环中,运行循环会对定时器保持一个强引用

2. 定时器的常用创建方式

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

这种方式创建的定时器 会被添加到 当前线程的 runloop 中 注意点:

  1. 如果当前线程是主线程,则默认runloop 开启,定时器被添加到 default 模式,如果 在主线程拖动 scrollView 以及它的子类,runloop 的模式会切换到 UITrackingRunLoopMode ,此时定时器会失效. 解决方式: ① 将定时器添加到UITrackingRunLoopMode中 ② 添加到NSRunLoopCommonModes 模式数组中,此方法会将定时器添加到所有打上 'common' 标签的模式中(包括UITrackingRunLoopMode)
  2. 如果当前线程为子线程,则需要获取当前 runloop ,并开启(默认子线程 runloop 不开启),这样才能让定时器运行.

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

这种方法创建的 NSTimer 对象需要手动添加到runloop 中,并指定模式.

3. 定时器常见的问题

###1. 循环引用 创建定时器的时候,定时器会对Target进行强引用,如果循环执行方法的话 就会一直引用 target 对象 不会释放,更可怕的是,如果 target 是 self 当前控制器,那么情况会更严重.

-(void)invalidate 要想释放定时器 只能调用上面的对象方法才可以! 正确的方式

recycleTimer?.invalidate()
recycleTimer = nil
复制代码

建议工作中,每周进行一次内存的优化监测 类似Xcode8的内存监测

Paste_Image.png