Main函数之前做了什么?
1. 动态库链接库
2. ImageLoader加载可执行文件,里面是被编译过的符号、代码等
3. runtime与+load
APP的启动过程,从main开始
1.main 函数
2.UIApplicationMain
*创建UIApplication对象
*创建UIApplication的delegate对象
3.如果有storyboard,根据info.plist获得Main.storyboard的文件名,加载Main.storyboard;如果没有storyboard,AppDelegate对象开始处理(监听)系统事件,程序启动完毕的时候,在application:didFinishLaunchingWithOptions:中
*创建UIWindow
*创建和设置UIWindow的rootViewController
*显示窗口
控制器View的生命周期
loadView:加载view
viewDidLoad:view加载完毕
viewWillAppear:控制器的view将要显示
viewWillLayoutSubviews:控制器的view将要布局子控件
viewDidLayoutSubviews:控制器的view布局子控件完成
viewDidAppear:控制器的view完全显示
viewWillDisappear:控制器的view即将消失的时候
viewDidDisappear:控制器的view完全消失的时候
事件的产生和传递
事件产生和传递过程
1.发生触摸事件后,系统会将该事件加入到一个由UIApplication管理的事件队列中
2.UIApplication会从事件队列中取出最前面的事件,并将事件分发下去以便处理,通常会先发送事件给应用程序的主窗口(keyWindow)
3.主窗口会在视图层次结构中找到一个最合适的视图来处理触摸事件,这也是整个事件处理过程的第一步
4.找到合适的视图控件后,就会调用视图控件的touches方法来做具体的事件处理
主窗口如何找到最合适的控件来处理事件?
1.判断自己是否能接收触摸事件
2.判断触摸点是否在自己身上
3.从后往前遍历子控件,重复前面两个步骤
4.如果没有符合条件的子控件,那么就自己最适合处理
UIView中提供了两个方法用来寻找最合适的View
// 用来寻找最合适的view处理事件,只要一个事件传递给一个控件就会调用控件的hitTest方法,参数point表示方法调用者坐标系上的点
- (nullable UIView*)hitTest:(CGPoint)point withEvent:(nullableUIEvent*)event;
// 用来判断当前这个点在不在方法调用者上,点必须在方法调用者的坐标系中,判断才会准确
- (BOOL)pointInside:(CGPoint)point withEvent:(nullable UIEvent *)event;
响应者链的传递过程
1.用户点击屏幕后产生一个触摸事件,经过一系列的传递过程后,会找到合适的视图控件来处理这个事件
2.找到最合适的视图控件后,就会调用控件的touches方法来做具体的事件处理
3.这些touches方法的默认做法是将事件顺着响应者链条向上传递,将事件交给响应者进行处理
4.判断上一个响应者,如果view的视图控制器存在,控制器就为上一个响应者,传递给控制器;如果控制器不存在,其父视图为上一个响应者,将其传递给它的父视图
5.在视图层次结构的最顶级视图,如果也不能处理收到的事件或者消息,则其将事件或消息传递给window对象进行处理
6.如果window对象也不处理,则其将事件或消息传递给UIApplication对象
7.如果UIApplication也不能处理该事件或消息,则将其丢弃
网友评论