ios应用启动流程

来源:互联网 发布:网络伤感男歌手排行榜 编辑:程序博客网 时间:2024/05/12 02:46

应用启动流程

首先,与传统C语言一样,IOS应用的执行入口也是定义在main.m中的main函数,代码如下

#import <UIKit/UIKit.h>#import "AppDelegate.h"int main(int argc, char * argv[]) {    @autoreleasepool {        return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));    }}

这段代码只干了一件事情——调用UIApplicationMain并返回。那么,这个UIApplicationMain又完成了什么工作呢?

UIApplicationMain的声明如下:

int UIApplicationMain ( int argc, char *argv[], NSString *principalClassName, NSString *delegateClassName );

Apple官方文档描述如下:

This function is called in the main entry point to create the application object and the application delegate and set up the event cycle.

也就是说这个作为在ios应用入口点被调用的函数主要做了两件事情,一是创建了UIApplication实例和UIApplicationDelegate实例,二是建立了事件循环用来接收系统事件。

接下来,它又通过UIApplication调用UIApplication的委托对象UIApplicationDelegate(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions方法初始化UIWindow和相应地根试图控制器并显示在屏幕上。

总结一下就是:

  1. 用户点击应用图标
  2. 系统调用main函数
  3. main函数调用UIApplicationMain函数
  4. UIApplication建立时间循环并创建UIApplicationUIApplicationDelegate实例
  5. UIApplication调用其委托对象UIApplicationDelegate(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions方法完成视图初始化并将视图显示在屏幕上

用一张图片表示或许会更直观一些:

IOS应用启动大体流程

UIApplication

上面提到了UIApplication类,并且UIApplicationMain函数的第三个参数也是一个UIApplication类的名称,那么这个UIApplication类又发挥什么样的作用呢?

这个UIApplication类其实就是整个应用的控制中心,由它负责协调应用中各对象的运行、交互。

严格来说,每个应用内有且只有一个UIApplication类(不过可以是UIApplication的子类),这个类的对象由UIApplicationMain函数进行创建,并且只会有一个(单例模式)。我们可以通过下面的方法得到它的实例对象:

UIApplication * application = [UIApplication sharedApplication];

UIApplication主要完成如下工作:

  1. 接收由事件循环送来的消息,并将消息分发到相应对象
  2. 管理视图,包括控制视图的显示、行为等
  3. 负责本地通知的创建和管理
  4. 该对象有一个Appdelegate委托对象,当一些重要的系统时间或生命周期事件(如应用程序启动、进入后台、收到低内存警告)发生时,应用程序通知该UIApplication,然后由UIApplication交由它的委托对象处理。

UIApplicationDelegate

在上面的UIApplicationMain函数的声明中,第四个参数就是一个UIApplicationDelegate类的名称,UIApplicationMain就是根据第三、四个参数提供的名称进行实例化UIApplicationUIApplicationDelegate对象并让UIApplicationDelegate成为UIApplication的委托对象。

不过要注意的一点就是

UIApplicationDelegate是一个协议而不是

UIApplicationDelegate协议定义了一坨(请原谅我的量词(⊙o⊙))方法(UIApplicationDelegate中定义的方法都是有UIApplication对象调用)用来处理在整个应用的生命周期中的一些重要的事件(比如应用程序启动,状态切换等等)。

这样,通过自己实现相应方法就可以对应用的一些重要事件进行自定义的处理(UIApplicationMainUIApplication一般来说不能够也不需要进行自定义,不过UIApplication可以自定义子类,但是一般情况下不需要)。比如实现跟应用启动有关的方法就可以自定义应用启动流程,实现与应用状态切换的方法就可以自定义应用从前台进入后台或从后台进入前台时的行为。

其中,跟应用启动有关的方法有如下一些:

/*应用开始启动但是状态还未恢复时调用此方法*/- (BOOL)application:(UIApplication *)application willFinishLaunchingWithOptions:(NSDictionary *)/*应用启动完成并且应用已经开始运行时调用此方法,一般在这个方法内进行应用窗口、视图的初始化*/- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions/*当应用处于前台并且能够接收消息时调用这个方法*/- (void)applicationDidBecomeActive:(UIApplication *)application

UIApplicationDelegate的方法调用与IOS应用的启动流程图结合来看应该会更加直观一些

应用启动与UIApplicationDelegate调用

0 0
原创粉丝点击