前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >深入浅出 RunLoop(一):初识

深入浅出 RunLoop(一):初识

作者头像
师大小海腾
发布2020-04-16 11:53:59
4440
发布2020-04-16 11:53:59
举报
文章被收录于专栏:iOS 技术分享

RunLoop 简介

  • 运行循环,在程序运行过程中循环做一些事情(如接收消息、处理消息、休眠等待等);
  • RunLoop是通过内部维护的事件循环来对事件/消息进行管理的一个对象;
  • RunLoop不是一个简单的do...while循环,它涉及到用户态和内核态之间的切换。

事件循环

事件循环就是对事件/消息进行管理,事件循环可以达到:

  • 没有消息需要处理时,休眠线程以避免资源占用。从用户态切换到内核态,等待消息;
  • 有消息需要处理时,立刻唤醒线程,回到用户态处理消息;
  • 通过调用mach_msg()函数来转移当前线程的控制权给内核态/用户态。

RunLoop 的基本作用

  • 保持程序的持续运行: 如果没有RunLoopmain()函数一执行完,程序就会立刻退出。 而我们的 iOS 程序能保持持续运行的原因就是在main()函数中调用了UIApplicationMain函数,这个函数内部会启动主线程的RunLoop
  • 处理 App 中的的各种事件(比如触摸事件、定时器事件等);
  • 节省 CPU 资源,提高程序性能:该做事时做事,该休息时休息。

RunLoop 的应用范畴

  • 定时器(Timer)、PerformSelector
  • GCD:dispatch_async(dispatch_get_main_queue(), ^{ });
  • 事件响应、手势识别、界面刷新
  • 网络请求
  • AutoreleasePool

RunLoop 对象

  • iOS 中有 2 套 API 来访问和使用RunLoop: ① Foundation:NSRunLoop(是CFRunLoopRef的封装,提供了面向对象的 API) ② Core Foundation:CFRunLoopRef
  • NSRunLoopCFRunLoopRef都代表着RunLoop对象
  • NSRunLoop不开源,而CFRunLoopRef是开源的:Core Foundation 源码
  • 获取RunLoop对象的方式:
代码语言:javascript
复制
    // Foundation
    [NSRunLoop mainRunLoop];     // 获取主线程的 RunLoop 对象
    [NSRunLoop currentRunLoop];  // 获取当前线程的 RunLoop 对象
    // Core Foundation
    CFRunLoopGetMain();     // 获取主线程的 RunLoop 对象
    CFRunLoopGetCurrent();  // 获取当前线程的 RunLoop 对象

RunLoop 在实际开发中的应用

  • 使用端口或自定义输入源与其他线程进行通信
  • 在子线程上使用定时器
  • 解决NSTimer在滑动时停止工作的问题
  • 控制线程的生命周期,实现一个常驻线程
  • 在 Cocoa 应用程序中使用任何performSelector...方法
  • 监控应用卡顿
  • 性能优化
  • ......

相关链接

Core Foundation 源码

苹果官方文档 RunLoop

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • RunLoop 简介
    • 事件循环
    • RunLoop 的基本作用
    • RunLoop 的应用范畴
    • RunLoop 对象
    • RunLoop 在实际开发中的应用
    • 相关链接
    相关产品与服务
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档