iOS App的生命周期
增加自己对iOS声明周期理解,转载自,Apple App Cycle
一个项目默认会有一个main文件。
#import <UIKit/UIKit.h>
#import "AppDelegate.h"
int main(int argc, char * argv[])
{
@autoreleasepool {
return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
}
}
这个函数的主要作用是
- 创建一个UIApplication对象
- 创建它对应的一个代理对象
- 开启RunLoop运行循环
- 如果UIStoryBoard存在的话,则从UIStoryBoard中加载用户界面
在应用程序启动的时候,UIApplication会初始化一些核心对象,并启动运行。UIApplication对象是每个iOS的核心对象。负责帮助iOS系统和其他对象之间的交互
列表列举一下每个对象
UIApplication 管理事件循环和高层组件的行为,负责完成iOS系统和我们定义对象的交互。
UIAppdelegate 监听Application中各种状态
Documents和Data Objects 数据模型对象存储应用的内容。针对特定应用的。
UIViewController 视图管理器管理应用程序内容在屏幕上的显示。视图控制器管理着一个根视图和一个子视图的集合。视图控制器通过把视图View安装到UIWindow上以展示在屏幕上。UIViewController是所有视图控制器的基类。封装了类似屏幕旋转。视图展示等一些列的操作。
UIWindow 窗口对象UIWindow。协调的屏幕上一个或者多个视图的展示。 大多数应用只有一个窗口。有一些应用有更多的窗口。但应用程序可能额外的窗口,用于在有外接显示器上显示内容。窗口内容从来不会被替换。屏幕内容的改变都是通过视图控制器来完成的。除了管理视图。窗口对象和UIApplication传递事件到UIView和CALayer.
UIView/CALayer 视图和控件提供可视化的展示。层对象实际上是代表视觉内容的数据对象,视图会大量的使用层对象来控制内容。
主运行循环
应用程序的运行循环处理所有与用户相关的事件。UIApplication对象在应用启动的时候运行循环,用来处理事件和视图的更新。顾名思义,各种事件在主运行循环串行执行。保证了执行的先后顺序。
用户和设备交互的事件是由操作系统产生的,这些事件发生到UIKit会建立一个端口。事件会在一个事件队列中排序。逐个分发。一个触摸(Touch)事件通常先分发到主窗口对象,然后依次分发到触摸事件发生的视图。但是这些事件并非是通过主运行循环进行分发。有些事件发生到代理对象和函数对象中。iOS中主要的事件类型包括:
- 触摸事件
- 远程控制事件
- 摇晃事件
- 加速器事件
- 定位
应用的执行状态
根据系统中发生的动作,应用会从一个状态转换到另外一个状态。比如,当用户按了Home键、电话打进来、或者其它中断放生,当前运行的应用就会切换自身的状态。应用的状态转换如下图所示:
应用的状态包括:
-
未运行
程序未启动
-
未激活
程序在前台运行,不给没有接收到事件。没有处理事件之前 处于这个状态。
-
激活
程序在前台接收到事件。
后台
程序在后台而且能执行代码,大多数程序进入这个状态后会在在这个状态上停留一会。时间到之后会进入挂起状态(Suspended)。有的程序经过特殊的请求后可以长期处于Backgroud状态
-
挂起
程序在后台不能执行代码。系统会自动把程序变成这个状态而不发送通知。
大部分的状态转换都在UIApplicationDelegate
中有相应的回调方法。这些方法是根据状态变化进行响应的地方,你可以通过重载这些方法实现自定义的操作。
应用结束
应用随时准备要退出。因此不能依靠退出时的动作来保存或者进行某些比较复杂的操作。当内存不够时,系统可能会关闭(Terminate)某个后台应用;一个应用有不当的行为或者不能及时响应事件,也可能被系统主动关闭