美文网首页
iOS 底层 - runloop的基本认识

iOS 底层 - runloop的基本认识

作者: 水中的蓝天 | 来源:发表于2020-04-05 10:36 被阅读0次

本文源自本人的学习记录整理与理解,其中参考阅读了部分优秀的博客和书籍,尽量以通俗简单的语句转述。引用到的地方如有遗漏或未能一一列举原文出处还望见谅与指出,另文章内容如有不妥之处还望指教,万分感谢 !


iOS系统中有两个关于Runloop的对象:NSRunLoopCFRunLoopRef
NSRunloop是Foundation框架提供的,是对CoreFoundation框架提供的CFRunloopRef的封装。
CoreFoundation提供的是纯C语言的API,都是线程安全的,Foundation不是线程安全的。
IOS 中Foundation是不开源的;
iOS 中RunLoop是开源的,在CoreFoundation的开源代码中,可以在这里下载:RunLoop源码

什么是RunLoop

RunLoop顾名思义就是运行循环,是在程序运行中循环做一些事情;有五种状态其中模式

RunLoop的基本作用是什么?有什么意义?系统中在那些地方有用到它 ?实际开发中会有哪些应用 ?

一般多用于以下几种场景:

  • 基本作用:

    • 保持程序的持续运行
    • 处理App中的各种事件:定时器(Timer)、PerformSelector(触摸事件)
    • 节约CPU资源,提高程序性能:该做事时做事,该休息时休息
  • 意义:

    • RunLoop存在的意义是可以保证程序一直处于运行状态,同时还可以处理各种事件;没有RunLoop,代码只要执行完就会马上退出,也就不能够保证程序的持续使用。
  • 应用范畴:

    • GCD;
      GCD的执行逻辑一般是不依赖RunLoop,只有少数需要;
      比如:异步回到主线程刷新UI、dispatch_after()、这样的操作才会交给RunLoop处理
    • 事件响应、手势识别、界面刷新
    • 网络请求
    • AutoreleasePool (自动释放池)
  • 实际开发中应用:

    • 控制线程的生命周期(线程保活)
    • 解决NSTime在滑动时停止工作的问题
    • 监控应用卡顿
    • 性能优化

RunLoop对象简单使用

//获得当前线程的RunLoop对象
[NSRunLoop currentRunLoop]
CFRunLoopGetCurrent()

//获得主线程的RunLoop对象
[NSRunLoop mainRunLoop]    
CFRunLoopGetMain()

RunLoop与线程的关系

  • 每条线程都有唯一的一个与之对应的RunLoop对象
  • RunLoop对象保存在一个全局的Dictionary(字典)里面,线程作为key,RunLoop对象作为value;
  • 线程刚创建出来时并没有RunLoop对象,RunLoop会在第一次获取(currentRunLoop)它时创建
  • RunLoop对象会在线程结束时一同销毁
  • 主线程的RunLoop对象由系统自动获取(创建)

    注意:子线程默认不会开启RunLoop需要注意

GCD函数能单独实现线程保活吗 ?

不能够的,GCD是开辟多线程执行任务,同时能够保证线程安全;就算GCD有相关API可以控制线程生命周期,本质上还是因为GCD内部用到了Runloop。线程的生命周期控制只有通过RunLoop技术才能实现。

相关文章

  • iOS 底层 - runloop的基本认识

    本文源自本人的学习记录整理与理解,其中参考阅读了部分优秀的博客和书籍,尽量以通俗简单的语句转述。引用到的地方如有遗...

  • iOS底层面试题--RunLoop

    什么是RunLoop? iOS底层面试题--RunLoop RunLoop面试题分析

  • Runloop

    Runloop 实现原理及应用iOS - RunLoop 底层源码详解及具体运用

  • 探寻RunLoop的本质

    iOS底层原理总结 - RunLoop 面试题 讲讲 RunLoop,项目中有用到吗? RunLoop内部实现逻辑...

  • RunLoop

    详细文章 xx_cc - iOS底层原理总结 - RunLoop 意一ineyee - RunLoop RunLo...

  • iOS底层原理——浅谈RunLoop

    RunLoop应用:线程保活 线程保活、控制销毁 iOS-浅谈RunLoop8iOS底层原理总结 - RunLoo...

  • RunLoop相关

    iOS底层原理总结 - RunLoop解密 Runloop Runloop是一种在当前线程,持续调度各种任务的运行...

  • 看 CFRunLoop源码深入理解 RunLoop

    原文地址Runloop是 iOS 中的基础概念,这篇文章将通过CFRunLoop源码来看RunLoop的概念及底层...

  • iOS-RunLoop01-基本认识

    RunLoop,顾名思义就是一种iOS框架中的运行循环,而程序在运行中,这个循环一直在为程序做一些事情。首先大家都...

  • OC底层基础:RunLoop

    查看oc文件底层结构 支持ARC、指定运行时系统版本 一、RunLoop基础 1. RunLoop对象 iOS中有...

网友评论

      本文标题:iOS 底层 - runloop的基本认识

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