oc 基础 - Runloop

194 阅读1分钟

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 运行逻辑

  1. 通知 observer 进入runloop

  2. 通知 observer 即将处理timer

  3. 通知 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在滑动时计算时间不精准 监控应用卡顿 性能优化