iOS程序的启动执行顺序
UIApplication对象
用户与iOS设备交互时产生的事件(Multitouch Events,Motion Event,Remote Control Event)交由UIApplication
对象来分发给control objects(UIControl)对应的target objects来处理并且管理整个事件循环,而一些关于app运行时重要事件委托给app delegate
来处理。
App delegate对象App delegate
对象遵循UIApplicationDelegate
协议,响应app运行时重要事件(app启动、app内存不足、app终止、切换到另一个app、切回app),主要用于app在启动时初始化一些重要数据结构;例如,初始化UIWindow
,设置一些属性,为window添加rootViewController
。
View controller对象View Controller
有一个view
属性是view层次结构中的根view,你可以添加子view来构建复杂的view;controller有一些viewDidLoad
、viewWillAppear
等方法来管理view的生命周期;由于它继承UIResponder
,所有还会响应和处理用户事件。
Documents和data model对象
data model对象主要用来存储数据。例如,饿了么app在搜索切换地址后,有历史记录搜索地址历史,当app下次启动时,读取和显示搜索地址历史。
document对象(继承UIDocument)用来管理一些或所有的data model对象。document对象并不是必须的,但提供一种方便的方式来分组属于单个文件或多个文件的数据。
UIWindow对象UIWindow
对象位于view层次结构中的最顶层,它充当一个基本容器而不显示内容,如果想显示内容,添加一个content view到window。
它也是继承UIResponder
,所以它也是会响应和处理用户事件。
View、control、layer对象View
对象可以通过addSubview和removeFromSuperview 等方法管理view的层次结构,使用layoutIfNeeded和setNeedsLayout等方法布局view的层次结构,当你发现系统提供view已经满足不了你想要的外观需求时,可以重写drawRect方法或通过layer属性来构造复杂的图形外观和动画。还有一点,UIView也是继承UIResponder,所以也能够处理用户事件。Control
对象通常就是处理特定类型用户交互的View,常用的有button、switch、text field等。
除了使用View
和Control
来构建view层次结构来影响app外观之外,还可以使用Core Animation框架的Layer
对象来渲染view外观和构建复杂的动画。
应用程序的状态和多任务
![](https://i-blog.csdnimg.cn/blog_migrate/28c77df98c551cf624568c934cb9df36.webp?x-image-process=image/format,png)
application:willFinishLaunchingWithOptions:
- 这个方法是你在启动时的第一次机会来执行代码application:didFinishLaunchingWithOptions:
- 这个方法允许你在显示app给用户之前执行最后的初始化操作applicationDidBecomeActive:
- app已经切换到active状态后需要执行的操作applicationWillResignActive:
- app将要从前台切换到后台时需要执行的操作applicationDidEnterBackground:
- app已经进入后台后需要执行的操作applicationWillEnterForeground:
- app将要从后台切换到前台需要执行的操作,但app还不是active状态applicationWillTerminate:
- app将要结束时需要执行的操作
现在启动程序看看执行的顺序:
1. 启动程序
①-[AppDelegate application:willFinishLaunchingWithOptions:]
②-[AppDelegate application:didFinishLaunchingWithOptions:]
③-[AppDelegate applicationDidBecomeActive:]
2. 按下home键
①-[AppDelegate applicationWillResignActive:]
②-[AppDelegate applicationDidEnterBackground:]
3. app在后台状态,点击app打开
①-[AppDelegate applicationWillEnterForeground:]
②-[AppDelegate applicationDidBecomeActive:]