本文首发于我的博客html
- 什么是Runloop
- ios程序中 main函数为何不会退出
- runloop和线程的关系?
- 程序中添加每3秒响应一次的NSTimer,当拖动tableview时timer可能没法响应要怎么解决?
- runloop内部实现逻辑?
- runloop 是怎么响应用户操做的, 具体流程是什么样的?
- 说说runLoop的几种状态
- runloop的mode做用是什么?
- 如何实现一个常驻线程
什么是Runloop
- Runloop 仍是比较顾名思义的一个东西,说白了就是一种循环,只不过它这种循环比较高级。通常的 while 循环会致使 CPU 进入忙等待状态,而 Runloop 则是一种“闲”等待,这部分能够类比 Linux 下的 epoll。当没有事件时,Runloop 会进入休眠状态,有事件发生时, Runloop 会去找对应的 Handler 处理事件。Runloop 可让线程在须要作事的时候忙起来,不须要的话就让线程休眠
- RunLoop是经过经过内部维护的时间循环来对事件/消息进行管理的一个对象
- 没有消息须要处理时,休眠避免掉资源占用
- 有消息时候,马上被唤醒
- 内核态 -> 用户态
ios程序中 main函数为何不会退出
- main函数内部调用 UIApplicationMain 这个方法会启动一个RunLoop,有事作就作事,没事作就等待,保持不会退出
runloop和线程的关系?
+ 每条线程都有惟一的一个与之对应的RunLoop对象
+ RunLoop保存在一个全局的Dictionary里,线程做为key,RunLoop做为value
+ 线程刚建立时并无RunLoop对象,RunLoop会在第一次获取它时建立
+ RunLoop会在线程结束时销毁
复制代码
runloop内部实现逻辑?
就是下图所示的,用本身话总结出来就好 ios
程序中添加每3秒响应一次的NSTimer,当拖动tableview时timer可能没法响应要怎么解决?
-
常见的2种Modegit
-
kCFRunLoopDefaultMode(NSDefaultRunLoopMode):App的默认Mode,一般主线程是在这个Mode下运行github
-
UITrackingRunLoopMode:界面跟踪 Mode,用于 ScrollView 追踪触摸滑动,保证界面滑动时不受其余 Mode 影响app
-
common模式下(一个占位用的Mode,不是一种真正的Mode) 能够兼容以上两种模式函数
runloop 是怎么响应用户操做的, 具体流程是什么样的?
- source1 捕捉用户触摸事件
- source0去处理触摸时间
说说runLoop的几种状态
- kCFRunLoopEntry = (1UL << 0), // 即将进入Loop
- kCFRunLoopBeforeTimers = (1UL << 1), //即将处理Timer
- kCFRunLoopBeforeSources = (1UL << 2), //即将处理Source
- kCFRunLoopBeforeWaiting = (1UL << 5), //即将进入休眠
- kCFRunLoopAfterWaiting = (1UL << 6), //刚从休眠中唤醒
- kCFRunLoopExit = (1UL << 7), //即将退出Loop
- kCFRunLoopAllActivities = 0x0FFFFFFFU //全部状态改变
runloop的mode做用是什么?
- 简单来讲就是不一样模式隔离开来,保证同一种摸下下运行,source0,source1,timer,observer 的运行更流畅
如何实现一个常驻线程
简单来讲就是oop
- 建立RunLoop
- 像RunLoop中添加port、source等来保证RunLoop不退出
- 启动RunLoop
本文相关代码github地址 github源码分析
本文参考资料:spa
RunLoop官方源码线程
iOS底层原理
更多资料,欢迎关注我的公众号,不定时分享各类技术文章。