程序启动分为两类:
有 Storyboard
没有 Storyboard
启动步骤如下:
① 加载 main 函数
② 在 main 函数里的 UIApplicationMain 方法中创建 Application 对象和 Application 的 delegate 对象
③ 创建主循环,代理对象开始监听事件
④ 调用
didFinishLaunchingWithOptions
方法,并在这个方法中创建 UIWindow⑤ 设置 UIWindow 的根控制器
⑥ 如果有 Storyboard,会根据 info.plist 找到应用程序的入口 Storyboard 并加载箭头所指的控制器
⑦ 显示窗口
本文考虑的是步骤 3 到步骤 7 将要调用的方法,其中有 AppDelegate,ViewController,View,ChildView 的方法:
load
:这是应用程序启动就会调用的方法,在这个方法里写的代码最先调用。initialize
:这个方法里一般写设置导航控制器的主题之类的。application:didFinishLaunchingWithOptions:
:这个方法里面会创建 UIWindow,设置根控制器并展现。loadView
:这个方法里创建视图的层次结构,这里需要注意,在没有创建控制器的 view 的情况下不能直接写 self.view,因为 self.view 的底层是通过懒加载方式创建的,否则会造成死循环。如果重写了这个方法,但里面什么都不写,会显示黑屏。viewDidLoad
:在这个方法中加载视图。View 的
initWithCoder:
方法(通过 Xib 创建)或者initWithFrame:
方法(通过代码创建):这个方法来初始化 View。View 的
awakeFromNib
方法:只有通过 Xib 方式创建的才会调用此方法,可在此方法中对 View 做一些操作。ChildView 的
initWithCoder:
方法(通过 Xib 创建)或者initWithFrame:
方法(通过代码创建):这个方法来初始化 ChildView。ChildView 的
awakeFromNib
方法:只有通过 Xib 方式创建的才会调用此方法,可在此方法中对 ChildView 做一些操作。viewWillAppear:
:视图将要出现,这个方法用的非常多,比如如果要设置导航栏的setNavigationBarHiden:animate:
一般在这里写,防止卡跳。applicationDidBecomeActive:
:这是 AppDelegate 的应用程序获取焦点方法,真正到了这里,所有东西才全部加载完毕,应用程序整装待发保持最佳状态等待用户操作。viewWillLayoutSubviews
:视图将要布局子视图,苹果建议的设置界面布局属性的方法。viewDidLayoutSubviews
:到了这里,视图布局全部完成。View 的
layoutSubviews
方法:调整 View 的子视图的布局,在这个方法里一般设置子控件的 frame。ChildView 的“layoutSubviews”方法:调整 ChildView 的子视图的布局,在这个方法里一般设置子控件的 frame。
View 的
drawRect:
方法:View 的子控件内部的画图方法,有时候需要用到 Quartz2D 的知识,此方法只能在加载时调用一次,如果后面还需要调用,比如下载进度的圆弧,需要一直刷帧,就要使用setNeedsDisplay
来定时多次调用本方法。ChildView 的
drawRect:
方法:ChildView 的子控件内部的画图方法。viewDidAppear:
:视图完全加载完成。
iOS -- 应用程序启动时调用方法顺序分析
最新推荐文章于 2021-02-02 11:50:11 发布