runloop
- runloop和线程是一一对应的关系,其关系保存在一个全局的dictionary里,
- 默认情况下线程没有runloop,只有主线程有runloop,因为子线程执行完任务就直接结束。
- cocoa 没有提供创建runloop的api,只能通过CFRunLoopGetMain()和CFRunLoopGetCurrent()获取,当获取时,检测到线程未创建runloop实例,则系统自动为其创建runloop
- autorelease pool 和runloop 有十分密切的联系,用户点击按钮的时候,主线程就从阻塞状态转向运行状态,主线成runloop也会出发kcrunloopafterwaiting状态变更,同理app静止时,主线程runloop就会进入kcfrunloopbeforewaiting。此时,runloop会调用一次object_autoreleasepoolpop 清理autorelease pool,紧接着调用objc_autoreleasepoolpush新建autorelease pool ,并发送mach_msg消息进入内核态,主线程进入阻塞态
- 一个runloop包含若干个mode,每个mode又包含若干个source/timer/observer,每次调用runloop只能指定一个model,这个model被称作current model。如果要切换model,只能退出loop循环,在重新制定一个mode进入。这么做的目的是什么?是为了分割开不同组的事件相互不受影响。
