面试题答案
一键面试1. NSDefaultRunLoopMode
- 作用:默认模式,RunLoop 在大部分情况下都运行在该模式下。在这个模式下,输入源(如端口、自定义输入源)和定时源(NSTimer)能正常工作。
- 使用场景:日常开发中,没有特别指定 RunLoop 模式时,就处于此模式。例如,应用程序的主线程默认以 NSDefaultRunLoopMode 运行,处理常规的用户交互(如点击、滚动等事件)、定时器触发以及其他常规的任务。
2. NSRunLoopCommonModes
- 作用:这并不是一个真正的运行循环模式,而是一个占位符集合。NSDefaultRunLoopMode、UITrackingRunLoopMode 等都属于这个集合。将一个输入源或定时源添加到 NSRunLoopCommonModes ,意味着它会在属于“CommonModes”集合的所有模式下都能被处理。
- 使用场景:比如添加一个 NSTimer ,希望它在界面滚动(UITrackingRunLoopMode)和正常交互(NSDefaultRunLoopMode)等多种常见情况下都能持续运行,就可以将这个 NSTimer 添加到 NSRunLoopCommonModes 中。
3. UITrackingRunLoopMode
- 作用:专门用于跟踪用户界面交互,在界面滚动等操作时,RunLoop 会切换到这个模式。在此模式下,系统会优化一些操作,例如会降低非关键的定时器频率,以保证界面滚动的流畅性。
- 使用场景:当用户进行界面滚动操作时,处于此模式。如果一个定时器不希望在界面滚动时执行(避免影响滚动流畅度),就不要将其添加到这个模式下;反之,如果希望某些任务在界面滚动时也能执行,就需要特殊处理,例如添加到 NSRunLoopCommonModes 。
4. GSEventReceiveRunLoopMode
- 作用:主要用于接收系统事件,处理与系统相关的底层输入事件。应用程序很少直接与之交互,主要由系统框架在幕后使用。
- 使用场景:系统层面接收和分发事件时使用,例如系统将触摸事件传递给应用程序的窗口,应用开发中一般不需要直接操作此模式。
5. NSModalPanelRunLoopMode
- 作用:用于模态面板的事件处理。当显示模态面板时,RunLoop 会切换到这个模式,以便专注处理模态面板相关的用户交互。
- 使用场景:当显示一个模态对话框时,RunLoop 运行在 NSModalPanelRunLoopMode ,在此期间,应用程序只处理与模态面板相关的事件,而不会处理其他常规的用户交互事件,直到模态面板被关闭。