美文网首页
Ios 面试复习--RunLoop

Ios 面试复习--RunLoop

作者: 金克拉拉拉拉 | 来源:发表于2017-12-05 01:46 被阅读0次
app本身就依赖一个和住线程关联的runloop

处理App中各种事件(触摸事件,定时器事件,selector事件)

深入理解Runloop 一篇非常详细的解读

1Runloop对象

ios中有2套API访问和使用Runloop

Foundation(OC)--->NSRunloop

Core Foundation(C)--->CFRunLoopRef(referenced)

其中NSRunloop是基于CFRunLoopRef的一层包装

2.Runloop与线程

每条线程都有唯一的一个与之对应的Runloop对象

3.获得runloop对象

[NSRunLoop currentRunLoop]获得当前线程runloop,其中在子线程中不会自动创建runloop对象,若有需要可以通过currentRunLoop 创建,且 runloop 对象懒加载,在第一次访问当前线程创建的runloop对象时会创建该对象

在主线程中 currentRunLoop == mainRunLoop

runloop 对象

在CFRunLoopRef中 currentRunLoop 实现相当于 参数是当前线程,若runloops为空,则创建一个可变字典,并创建一个mainLoop,并将其添加进该字典key is mainThread,再将当前线程传入函数,并从字典中取出newloop 若newloop为空则创建,最后返回newloop,保证一条线程只有一个runloop,同时,访问其他线程runloop 会优先访问住线程runloop sososo主线程runloop是自动创建的

4.RunLoop相关类

Core Foundation 中关于RunLoop的5个类

CFRunLoopRef

CFRunLoopModeRef

CFRunLoopSourceRef

CFRunLoopTimerRef

CFRunLoopObserverRef

其中runloop是事件驱动 必须拥有mode 而model 又由source observer 和timer构成

runloop构成

5.CFRunLoopModeRef 

其中CFRunLoopModeRef 代表RunLoop的运行模式

一个RunLoop包换若干个Mode ,而没个Mode又包含若干个source<set>  timer<array> observer <array>

每次RunLoop启动时,指定一个mode 该mode 为current mode 若需要切换mode 则需要退出当前循环,再重新指定一个mode 进入(是为了分隔不同组的time observer source 的影响)

系统默认注册5个mode ,其中开发者能触碰使用的有2种

kCFRunLoopDefaultMode 默认Mode 主线程通常在该Mode 下进行(定时器默认在defaultMode中进行)

kCFRunLoopCommonModes 占位Mode 并不是一种真正的Mode

UITrackingRunLoopMode 界面跟踪Mode,用于Scrollview追踪触摸滑动页面时 保证不受其他Mode影响(多用于滚动更加的流畅)--------->并未开放

6.CFRunLoopTimerRef

是一个基于时间触发器

NSRunLoopCommonModes 解读

同时滚动一个scorllview时 timer不工作,因为在滚动时Run Loop 为UITrackingRunLoopMode 

其中被标记为common modes 模式的 mode 通常有两个kCFRunLoopDefaultMode和UITrackingRunLoopMode


相关文章

网友评论

      本文标题:Ios 面试复习--RunLoop

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