美文网首页
iOS开发:RunLoop的基本用法

iOS开发:RunLoop的基本用法

作者: 狂奔的蜗牛_ | 来源:发表于2019-08-13 09:46 被阅读0次

定时器(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方法里,写下面俩句代码。

取消定时器

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

相关文章

  • iOS开发:RunLoop的基本用法

    定时器(NSTimer) 一般定时器的常用的创建方式可为俩大类: 1)timerWithTimeInterval,...

  • iOS开发 Runloop机制

    iOS开发 Runloop机制

  • iOS知识梳理8:万恶的Runtime

    本文中所使用的参考链接:ios开发-Runtime详解ios Runtime几种基本用法简记iOS运行时详解ios...

  • Runloop的应用场景

    runloop是iOS开发中比较重要的一个概念,之前的博客也有总结过它的基本概念runloop笔记,不过很多人包括...

  • RunLoop

    详情见: iOS中的RunLoop 1、什么是RunLoop?2、开发中如何使用RunLoop?什么应用场景?3、...

  • GeekBand - iOS 多线程和RunLoop 总结

    iOS 开发高级进阶 第三周 多线程 Runloop iOS 多线程以及 RunLoop 学习总结 基础知识 什么...

  • RunLoop笔记

    RunLoop是iOS和OSX中基本的概念,掌握RunLoop,能了解到苹果是如何利用RunLoop实现自动释放池...

  • RunLoop

    一、基本作用 二、main函数中的RunLoop 三、RunLoop对象 iOS API NSRunLoop和CF...

  • iOS RunLoop(1)RunLoop简介

    iOS RunLoop(1)RunLoop简介iOS RunLoop(2)RunLoop相关类iOS RunLo...

  • iOS RunLoop(2)RunLoop相关类

    iOS RunLoop(1)RunLoop简介iOS RunLoop(2)RunLoop相关类iOS RunLo...

网友评论

      本文标题:iOS开发:RunLoop的基本用法

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