iOS 应用程序一般都是由自己编写的代码和系统框架(system frameworks)组成,系统框架提供一些基本infrastructure给所有 app 来运行,而你提供自己编写的代码来定制app的外观和行为。因此,了解iOS infrastructure 和它们如何工作对编写app是很有帮助的。
iOS 应用程序的启动执行顺序
启动顺序
首先,来了解一下这张图
以上,就是一个应用程序的执行顺序。接下来,让我们具体的了解一下这个流程
1. 程序入口:
执行 main 函数,设置 AppDelegate 称为函数的代理
2. 程序完成加载
[AppDelegate application:didFinishLaunchingWithOptions:]
3. 创建 window 窗口
4. 程序被激活
[AppDelegate applicationDidBecomeActive:]
5. 当点击 home 键时:
程序取消激活状态
[AppDelegate applicationWillResignActive:]
程序进入后台
[AppDelegate applicationDidEnterBackground:]
6. 点击进入项目工程中:
程序进入前台
[AppDelegate applicationWillEnterForeground:]
程序重新激活
[AppDelegate applicationDidBecomeActive:]
iOS 程序的状态
从上面的这个流程,我们可以发现它包括几个状态:后台、前台、激活、未激活。其实,iOS的应用程序共有5种状态:
- Not running(未运行):程序未启动
- Inactive(未激活):其他两个状态切换时出现的短暂状态。当用户锁屏或者系统提示用户去响应 Alert窗口(如来电、信息等)时
- Active(激活):在屏幕下显示正常的运行状态,该状态下可以接受用户输入并及时更新显示
- Background(后台)::程序在后台且能执行代码。用户按下Home键不久后进入此状态(先进入了Inactive状态,再进入Background状态),然后会迅速进入挂起状态(Suspended)。有的程序经过特殊的请求后可以长期处于Backgroud状态
- Suspended (挂起):程序在后台不能执行代码。普通程序在进入Background状态不久后就会进入此状态。当挂起时,程序还是停留在内存中的,当系统内存低时,系统就把挂起的程序清除掉,为前台程序提供更多的内存
转换过程如图:
程序的入口
首先,下面的函数就是我们经常看到的 main 函数
int main(int argc, char *argv[])
{
@autoreleasepool {
return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
}
}
main函数的两个参数,iOS中没有用到,包括这两个参数是为了与标准ANSI C保持一致。我们接着看 UIApplicationMain 的参数,前两个和 main 函数的相同,重点是后面的两个,在官方文档中是这样说明的。
/ If nil is specified for principalClassName, the value for NSPrincipalClass from the Info.plist is used. If there is no
// NSPrincipal