一、什么是RunLoop ?
1.从字面意思看,就是:运行循环,跑圈。
2、其实它内部就是do-while循环,在这个循环内部不断的处理各种任务(比如source,Timer,Observer)。
3.一个线程对应一个RunLoop,主线程的RunLoop默认已经启动,子线程的RunLoop需要手动启动(调用run方法);
4.RunLoop只能选择一个Mode启动,如果当前Mode没有任何source,Timer,Observer,那么就直接退出RunLoop。
二、自动释放池什么时候释放?
在RunLoop睡眠之前释放(KCFRunLoopBeforeWaiting),在进入RunLoop时创建。
三、在开发中如何使用RunLoop?什么应用场景?
1.开启一个常驻线程,让一个子线程不进入消亡状态,等待其他进程发来消息,处理其他事件;在子线程中开启一个定时器;在子线程中进行一些长期监控。
2.可以控制定时器在特定模式下执行。
3.可以让某些事件、行为、任务在特定的模式下执行。
4.可以添加Observer监听RunLoop的状态,比如监听事件的处理(在所有点击事件之前做一些事情)。
四、CFRunLoopModeRef代表RunLoop的运行模式
一个RunLoop包含若干个Mode,每个Mode又包含若干个Source/Timer/Observer
每次RunLoop启动时,只能指定其中一个Mode,这个Mode被称作CurrentMode
如果需要切换Mode,只能退出Loop,再重新指定一个Mode进入
这样做主要是为了分隔开不同组的Source/Timer/Observer,让其互不影响
五、系统默认注册了5个Mode:
kCFRunLoopDefaultMode:App的默认Mode,通常主线程是在这个Mode下运行
UITrackingRunLoopMode:界面跟踪Mode,用于ScrollView追踪触摸滑动,保证界面滑动时不受其他Mode影响
UIInitializationRunLoopMode:在刚启动App时第进入的第一个Mode,启动完成后就不再使用
GSEventReceiveRunLoopMode:接受系统事件的内部Mode,通常用不到
kCFRunLoopCommonModes:这是一个占位用的Mode,不是一种真正的Mode,在kCFRunLoopDefaultMode模式情况和UITrackingRunLoopMode情况都会运行。
六、RunLoop处理逻辑-网友整理版