面试题答案
一键面试RunLoop和线程之间的联系
- 一一对应关系:在Objective-C中,每个线程(包括主线程和子线程)都有与之对应的RunLoop对象。主线程的RunLoop在应用程序启动时自动创建并启动,而子线程的RunLoop默认是不创建的,只有当调用
[NSRunLoop currentRunLoop]
时才会创建。 - 管理线程资源:RunLoop负责管理线程的输入源(Input Sources)和定时源(Timer Sources)。输入源用于处理异步事件,如端口消息、基于Selector的事件等;定时源用于处理周期性事件,如NSTimer。通过管理这些源,RunLoop决定线程何时处理事件,何时进入睡眠状态以节省资源。
RunLoop能维持线程生命周期的原因
- 防止线程退出:当RunLoop启动后,它会进入一个循环,不断检查输入源和定时源是否有事件需要处理。只要有事件需要处理,RunLoop就会处理这些事件,使得线程保持运行状态。如果没有RunLoop,线程执行完其任务后就会自动退出。
- 事件驱动模型:RunLoop采用事件驱动的编程模型,它等待事件的发生,当事件到来时唤醒线程并处理事件。处理完事件后,线程又回到等待状态,而不是一直处于运行状态消耗CPU资源。这种机制使得线程可以在有工作时执行,无工作时休眠,从而有效地维持线程的生命周期,同时提高系统资源的利用率。
- 内存管理:在基于RunLoop的应用中,很多对象的生命周期管理与RunLoop密切相关。例如,一些对象可能在RunLoop处理事件的过程中被创建和释放。如果RunLoop停止,这些依赖于事件驱动的对象管理机制可能会受到影响,进而影响整个应用的稳定性。所以RunLoop对于维持依赖于它的对象的生命周期以及线程的稳定运行起着关键作用。