iOS开发:RunLoop的基本用法

定时器(NSTimer)

一般定时器的常用的创建方式可为俩大类:

1)timerWithTimeInterval,如下:

timerWithTimeInterval

通过这种方式创建的定时器,程序运行起来,定时器不会自己启动,必须手动把定时器加入到 NSDefaultRunLoopMode模式下。创建方式如下:

创建定时器

2)scheduledTimerWithTimeInterval,如下:

iOS开发:RunLoop的基本用法_第1张图片
scheduledTimerWithTimeInterval

 通过这种方式创建的定时器,系统会自动会自动添加到当前runLoop中,而且是NSDefaultRunLoopMode,所以定时器就会立马工作。

NSDefaultRunLoopMode模式下的定时器有个缺点,就是当界面滑动时(例如UITextVeiw滑动),这时候RunLoop的模式就变成UITrackingRunLoopMode,一旦RunLoop进入其他模式,定时器就停止工作。而UITrackingRunLoopMode模式只运行在界面滑动的时候,所以想要让定时器在界面滑动和不滑动时定时器都工作,那么需要把runLoop的模式切换成 NSRunLoopCommonModes。

NSRunLoopCommonModes,可简单理解为包含了俩中模式:UITrackingRunLoopMode和NSDefaultRunLoopMode

如果想要修改当前的runLoop模式,例如timer的模式,如下所示

修改timer的模式

使用注意:定时器不用时,一定要置为空,防止定时器一直在运行,导致内存泄漏或内存暴增。在定时器所在控制器的dealloc方法里,写下面俩句代码。

iOS开发:RunLoop的基本用法_第2张图片
定时器置为空

遇到的方案:事件A和B,如果你想拖动时让B事件进行,A事件停止,停止拖动时让A事件进行,B事件停止,你可以把A事件模式设置为DefaultRunLoopMode,B事件模式设置为UITrackingRunLoopMode,把你想做的停止滚动时想做的模式设置为DefaultRunLoopMode。


创建observer,监听RunLoop的状态

看 observer 方法里的打印,你会发现 CFRunLoopObserverRef 的运行机理

创建observer,监听RunLoop的状态

 添加观察者:监听RunLoop的状态

监听RunLoop的状态

释放Observer

释放Observer

打印出的数据如下:

打印出的数据

对应 CFRunLoopActivity 如下:

iOS开发:RunLoop的基本用法_第3张图片
对应 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的形式:

iOS开发:RunLoop的基本用法_第4张图片
block回调

启动定时器:

启动定时器

使用注意:GCD定时器不用时,一定要置为空,防止定时器一直在运行,导致内存泄漏或内存暴增。在定时器所在控制器的dealloc方法里,写下面俩句代码。

取消定时器

注意:以上属于原创,是笔者工作中总结出来的,若有雷同纯属巧合;如有错误,请多多指正,转载请标明来源和作者。

你可能感兴趣的:(iOS开发:RunLoop的基本用法)