runloop 作用 保持程序不会马上退出 处理APP的各种事件 (比如触摸事件 定时器事件) 节省CPU资源 提高程序性能
NSrunloop = [NSrunloop currentRunloop] NSrunloop = [NSrunloop mainRunloop] 主线程的
CFRunloop_getcurrentRunloop
每一个线程都有唯一一个runloop
所有的runloop 保存在全局 线程作为key
会在第一次获取的时候创建
在线程销毁的时候 销毁
runloop 相关的类
CFrunloopRef CFRunloopModeRef CFrunloopSourceRef CFRunloopTimerRef CFRunloopObserverRef
CFrunloopRef { static __CFRunloop { pthred _pthread; CFMutableSetRef _commonModes; CFMutableSetRef _commonModeItems; CFRunloopMode _curentModel; CFMutableSetRef _models }
}
_curentModel { _name _source0; { CFrunloopSourceRef } _source1; _observers;{ CFRunloopObserverRef } _timers { CFRunloopTimerRef } }
runloop { Model, model2 ,mode3, }
model { source0; (触摸事件的处理 source0->_handleEventQueue ->UIApplication -> UIWindow -> UIResponder) self performSwlector @selector() inThread: source1; (基于port 线程间的通讯) source1 捕捉系统事件 分发给source0; timers; NStimer
observers
监听runloop的状态
UI刷新(beforeWaiting) 休眠前刷新UI
autorelease pool (beforeWaiting) 休眠前清理需要释放的对象
}
运行过程中只有一种模式
切换model 必须先退出再选择另一个model
KCFRunloopDefaultModel 默认的
UItrackingRunloopModel 滚动撞他下的model
KCFRunloopComonModel
// 监听runloop 状态
KCFRUnloopCommonModels == KCFRunloopDefaultModel + UItrackingRunloopModel
CFrunloopCreate
CFrunloopAddObserver(,KCFRUnloopCommonModels)
RUnloop 运行逻辑
-
通知 observer 进入runloop
-
通知 observer 即将处理timer
-
通知 observer 即将处理sources 4, 处理blocks (KCFAddBlock() {}) 5 处理 source0 6 如果存在 source1 跳转到弟八步骤 7 通知 observer 开始休眠 8 通知 observer 结束休眠
{ 执行前面的 ->2 ->3 ->4 ->5... } 9 处理blocks
10 根据前面的执行结果决定如何操作 { -> 2->3.... }
休眠实现原理 内核层面的API mach_mag() 用户态 内核态的切换
真正的休眠,而不是 线程的阻塞 . 节省CPU 资源 省电
// 应用
控制线程的声明周期 线程 解决nstimer在滑动时计算时间不精准 监控应用卡顿 性能优化