安全+效率:因为 UIKit 框架不是线程安全的框架,当在多个线程进行 UI 操作,有可能出现资源抢夺,导致问题。
技术方案 | 简介 | 语言 | 线程声明周期 | 使用频率 |
---|---|---|---|---|
pthread | ● 一套通用的多线程API● 适用于Unix\Linux\Windows等系统● 跨平台\可移植● 使用难度大 | C | 程序员管理 | 几乎不用 |
NSThread | ● 使用更加面向对象● 简单易用,可直接操作线程对象 | OC | 程序员管理 | 偶尔使用 |
GCD | ● 旨在替代NSThread等线程技术● 充分利用设备的多核 | C | 自动管理 | 经常使用 |
NSOperation | ● 基于GCD(底层是GCD)● 比GCD多了一些更简单实用的功能● 使用更加面向对象 | OC | 自动管理 | 经常使用 |
苹果官方文档:线程编程指南——RunLoop
从苹果官方文档可以看到,RunLoop
的相关介绍写在线程编程指南中,可见RunLoop
和线程的关系不一般。
RunLoop
对象和线程是一一对应关系RunLoop
保存在一个全局的Dictionary
里,线程作为key
,RunLoop
作为value
RunLoop
创建时机:线程刚创建时并没有RunLoop
对象,RunLoop
会在第一次获取它时创建RunLoop
销毁时机:RunLoop
会在线程结束时销毁RunLoop
已经自动获取(创建),子线程默认没有开启RunLoop
RunLoop
对象是在UIApplicationMain
中通过[NSRunLoop currentRunLoop]
获取,一旦发现它不存在,就会创建RunLoop
对象相关链接:深入浅出 RunLoop(四):RunLoop 与线程