runloop工作主要原理和总结:
- 初始化UIApplication单例对象
- 初始化AppDelegate对象,并设为UIApplication对象的代理
- 检查Info.plist设置的xib文件是否有效,如果有则解冻Nib文件并设置outlets,创建显示key window、rootViewController、与rootViewController关联的根view(没有关联则看rootViewController同名的xib),否则launch之后由程序员手动加载。
- 建立一个主事件循环,其中包含UIApplication的Runloop来开始处理事件。
- 初始化UIApplication单例对象
- 初始化AppDelegate对象,并设为UIApplication对象的代理
- 检查Info.plist设置的xib文件是否有效,如果有则解冻Nib文件并设置outlets,创建显示key window、rootViewController、与rootViewController关联的根view(没有关联则看rootViewController同名的xib),否则launch之后由程序员手动加载。
- 建立一个主事件循环,其中包含UIApplication的Runloop来开始处理事件。
UIApplication:
1、通过window管理视图;
2、发送Runloop封装好的control消息给target;
3、处理URL,应用图标警告,联网状态,状态栏,远程事件等。
AppDelegate:
管理UIApplication生命周期和应用的五种状态(notRunning/inactive/active/background/suspend)。
Key Window:
1、显示view;
2、管理rootViewcontroller生命周期;
3、发送UIApplication传来的事件消息给view。
rootViewController:
1、管理view(view生命周期;view的数据源/代理;view与superView之间事件响应nextResponder的“备胎”);
2、界面跳转与传值;
3、状态栏,屏幕旋转。
view:
1、通过作为CALayer的代理,管理layer的渲染(顺序大概是先更新约束,再layout再display)和动画(默认layer的属性可动画,view默认禁止,在UIView的block分类方法里才打开动画)。layer是RGBA纹理,通过和mask位图(含alpha属性)关联将合成后的layer纹理填充在像素点内,GPU每1/60秒将计算出的纹理display在像素点中。
2、布局子控件(屏幕旋转或者子视图布局变动时,view会重新布局)。
3、事件响应:event和guesture。
插播控制器生命周期
runloop:
1、(要让马儿跑)通过do-while死循环让程序持续运行:接收用户输入,调度处理事件时间。
2、(要让马儿少吃草)通过mach_msg()让runloop没事时进入trap状态,节省CPU资源。
1、与线程和自动释放池相关:
2、CFRunLoopRef构造:数据结构;创建与退出;mode切换和item依赖;Runloop启动
- CFRunLoopModeRef:数据结构(与CFRunLoopRef放一起了);创建;类型;
modeItems:- CFRunLoopSourceRef:数据结构(source0/source1);
- source0 :
- source1 :
- CFRunLoopTimerRef:数据结构;创建与生效;相关类型(GCD的timer与CADisplayLink)
- CFRunLoopObserverRef:数据结构;创建与添加;监听的状态;
3、Runloop内部逻辑:关键在两个判断点(是否睡觉,是否退出)
- 代码实现:
- 函数作用栈显示:
4、Runloop本质:mach port和mach_msg()。
5、如何处理事件:
- 界面刷新:
- 手势识别:
- GCD任务:
- timer:(与CADisplayLink)
- 网络请求:
6、应用:
- 滑动与图片刷新;
- 常驻子线程,保持子线程一直处理事件