定时器(NSTimer)
一般定时器的常用的创建方式可为俩大类:
1)timerWithTimeInterval,如下:
timerWithTimeInterval通过这种方式创建的定时器,程序运行起来,定时器不会自己启动,必须手动把定时器加入到 NSDefaultRunLoopMode模式下。创建方式如下:
创建定时器2)scheduledTimerWithTimeInterval,如下:
scheduledTimerWithTimeInterval通过这种方式创建的定时器,系统会自动会自动添加到当前runLoop中,而且是NSDefaultRunLoopMode,所以定时器就会立马工作。
NSDefaultRunLoopMode模式下的定时器有个缺点,就是当界面滑动时(例如UITextVeiw滑动),这时候RunLoop的模式就变成UITrackingRunLoopMode,一旦RunLoop进入其他模式,定时器就停止工作。而UITrackingRunLoopMode模式只运行在界面滑动的时候,所以想要让定时器在界面滑动和不滑动时定时器都工作,那么需要把runLoop的模式切换成 NSRunLoopCommonModes。
NSRunLoopCommonModes,可简单理解为包含了俩中模式:UITrackingRunLoopMode和NSDefaultRunLoopMode
如果想要修改当前的runLoop模式,例如timer的模式,如下所示
修改timer的模式使用注意:定时器不用时,一定要置为空,防止定时器一直在运行,导致内存泄漏或内存暴增。在定时器所在控制器的dealloc方法里,写下面俩句代码。
定时器置为空遇到的方案:事件A和B,如果你想拖动时让B事件进行,A事件停止,停止拖动时让A事件进行,B事件停止,你可以把A事件模式设置为DefaultRunLoopMode,B事件模式设置为UITrackingRunLoopMode,把你想做的停止滚动时想做的模式设置为DefaultRunLoopMode。
创建observer,监听RunLoop的状态
看 observer 方法里的打印,你会发现 CFRunLoopObserverRef 的运行机理
创建observer,监听RunLoop的状态添加观察者:监听RunLoop的状态
监听RunLoop的状态释放Observer
释放Observer打印出的数据如下:
打印出的数据对应 CFRunLoopActivity 如下:
对应 CFRunLoopActivity注意: 现在ARC模式开发,我们创建的OC对象,不需要我们管理内存释放。但是CF(CFRunLoopObserverRef)的内存管理(Core Foundation),不是OC对象,是C语言层面的东西,不受ARC控制,得手动释放。
1.凡是带有Create、Copy、Retain等字眼的函数,创建出来的对象,都需要在最后做一次release
* 比如CFRunLoopObserverCreate
2.release函数:CFRelease(对象);
定时器如何摆脱runLoop的影响
GCD定时器不受RunLoop的Model的影响
GCD定时器属性创建,如下:
GCD定时器属性创建创建GCD定时器,如下:
创建GCD定时器GCD的时间参数,一般是纳秒(1秒 == 10的9次方纳秒),比NSTimer精确的多;
宏:NSEC_PER_SEC是个纳秒,官方文档显示如下:
NSEC_PER_SEC是个纳秒 间隔时间回调,是block的形式:
block回调启动定时器:
启动定时器使用注意:GCD定时器不用时,一定要置为空,防止定时器一直在运行,导致内存泄漏或内存暴增。在定时器所在控制器的dealloc方法里,写下面俩句代码。
取消定时器
网友评论