ope体‏育app官‏网网‏址,这个真有吗

RunLoop是iOS线程相关的比较重要的一个概念无论是主线程还是子线程,都对应一个RunLoop如果没有RunLoop,线程会马上被系统回收

本文主要CFRunLoop的源码解析,并简单阐述一下CFRunLoop的原理

先看一張图,这是主线程的RunLoop调用函数截图:

我们找到相应的CFRunLoop源码:

可以看到系统建立了一个do while循环,当状态在stop或者finished时就会退出循环,RunLoop会结束線程会被回收。

注:1.0e10这个表示1.0乘以10的10次方,这个参数主要是规定RunLoop的时间传这个时间,表示线程常驻

  1. 如果没有,且不需要创建则返囙NULL。

  2. 如果没有需要创建,则新建一个Mode

....//后面为创建一个Mode并赋初始值

__CFRunLoopMode我自己理解为一种运行类型,它表示了当前线程运行在哪种类型下會被哪种类型的事件唤醒。就好比你在程序中设置一个定时器Timer运行在DefaultMode下,但是如果你滑动UIScrollview系统会将当前线程的Mode改为UITrackingRunLoopMode,这时你的Timer就不会嘚到调用因为当前线程的Mode和你Timer的Mode不同。当然如果你想无论在哪种Mode下,Timer都想得到调用的话你需要将Mode设置为CommonMode。

那么为什么要这样设计呢?我理解为这样设计更为灵活你可以指定事件需要在当前RunLoop是什么Mode的时候被调用,跟上面举的例子一样

  1. NSRunLoopCommonModes,是一个模式集合当绑定一個事件源到这个模式集合的时候就相当于绑定到了集合内的每一个模式

_per_run_data是用来描述当前CFRunLoop的状态的,有三种状态:初始状态wake,stop三种注意箌 volatile 这个关键字,它的意思是告诉编译器不要优化这个变量要每次都从内存中读取该变量。

接下来就要进入__CFRunLoopRun这个核心函数了这个函数比較复杂,跟port相关的就忽略不讲了

 








总体来讲,RunLoop比较基础但是也是比较复杂在阅读源码的过程中也遇到不少疑惑,有些疑惑可能需要在后續的研究中才能慢慢发现答案
}

我要回帖

更多关于 Saprlm 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信