RunLoop翻译过来就是运行循环,就是保证程序运行的,本质就是个循环,它的目的本质就是为了保活,保护线程的活跃,能处理事件,NSTimer定时器,等等不方便在顺序程序中完成的 *** 作,而它又不同于普通的循环,因为它会休眠,相较于普通循环,它不会不停的占用着cpu gpu资源不放
基本流程:因为它是线程保活用的,所以一个线程对应一个RunLoop,同时保存在一个字典里面,由线程当Key,当创建了线程需要使用就会创建RunLoop对象,线程结束,RunLoop被销毁,手动创建的子线程,不会自动开启RunLoop
代码层面let runloop = RunLoop.current
let runloop1 = CFRunLoopGetCurrent()
let runloop2 = CFRunLoopGetMain()
print(runloop,runloop1)
Optional(
RunLoop可以有两种获取方式,其实是同一个东西,只是语言不同,第一个是根据OC改的,是基于NSObject,第二个是基于C的,包装出来是可选项,看地址可以看到,除了调用不同,访问的是同一个RunLoop
从Swift角度来说无疑是CFRunLoop更适合,因为开源+返回的是可选项,更符合Swift的可选链编程
CF系列源码: Source Browser
所以可以说RunLoop和线程的关系是保证线程活性的一个特殊的循环,主线程是一定有的,子线程如果不使用默认是没有,那么在线程代码执行完毕后,这个线程就会关闭,并且在没有开启RunLoop的情况下定时器和延时 *** 作都是无法正常使用的
补充:如果RunLoop的集合里面是空的,激活了也没用,所以一般要做保活 *** 作,一定要加一个无意义的东西,比如port
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)