iOS一切的生命之源都需要RunLoop的支持,关于RunLoop的界面和相关知识,网上想你一一搜一天也看不完,所以这里只为总结Runloop相关技术,适用于底层,面试,简单实战了解!
前言:
1 | + 一个线程只能执行一个任务,任务执行完之后,线程就会退出,但是主线程不会退出,因为我们需要让主线程等待接收事件 |
介绍
1 | + 运行循环(do-while):不断处理各种事件 |
runloop退出的条件:
1 | app退出;线程关闭;设置最大时间到期;modeItem为空; |
Ref
1 | + CFRunLoopTimerRef,基于时间触发(NSTimer),受Model影响,GCD不受Model影响 |
Runloop本质:mach port和mach_msg()。
1 | Mach是XNU的内核,进程、线程和虚拟内存等对象通过端口发消息进行通信,Runloop通过mach_msg()函数发送消息,如果没有port 消息,内核会将线程置于等待状态 mach_msg_trap() 。如果有消息,判断消息类型处理事件,并通过modeItem的callback回调(处理事件的具体执行是在DoBlock里还是在回调里目前我还不太明白???)。 |
定时源,输入源
1 | + 定时源,同步消息,特定或者一定时间间隔发生 |
应用
1 | + NSTimer,ImageView显示,PerformSelector,常驻线程,自动释放池,界面刷新,手势识别,GCD任务,timer:(与CADisplayLink),网络请求: |
autorrelease释放时机:
1 | + 手动干预释放:指定autorreleasepool,当前作用域大括号结束立即释放 |
自动释放池
1 | 自动释放池寄生于Runloop:程序启动后,主线程注册了两个Observer监听runloop的进出与睡觉。一个最高优先级OB监测Entry状态;一个最低优先级OB监听BeforeWaiting状态和Exit状态。 |
Timer注意
1 | 1、如果是在主线程中运行timer,想要timer在某界面有视图滚动时,依然能正常运转,那么将timer添加到RunLoop中时,就需要设置mode 为NSRunLoopCommonModes。 |
runloop:
1 | 1、(要让马儿跑)通过do-while死循环让程序持续运行:接收用户输入,调度处理事件时间。 |