App启动原理和启动过程

一、程序启动原理

1.1、main函数中执行了一个UIApplicationMain这个函数UIApplicationMain(int argc, char *argv[], NSString *principalClassName, NSString *delegateClassName);

1.2、argc、argv:直接传递给UIApplicationMain进行相关处理即可 

     principalClassName:指定应用程序类名(app的象征),该类必须是UIApplication(或子类)。如果为nil,则用UIApplication类作为默认值

     delegateClassName:指定应用程序的代理类,该类必须遵守UIApplicationDelegate协议

1.3、UIApplicationMain函数会根据principalClassName创建UIApplication对象,根据delegateClassName创建一个delegate对象,并将该delegate对象赋值给UIApplication对象中的delegate属性

1.4、接着会建立应用程序的Main Runloop(事件循环),进行事件的处理(首先会在程序完毕后调用delegate对application:didFinishLaunchingWithOptions:方法)

1.5、程序正常退出时UIApplicationMain函数才返回

#import <UIKit/UIKit.h>
#import"AppDelegate.h"int main(int argc, char * argv[])
{
    @autoreleasepool {
        // return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
        // return UIApplicationMain(argc, argv, @"UIApplication", NSStringFromClass([AppDelegate class]));/*
         argc: 系统或者用户传入的参数个数
         argv: 系统或者用户传入的实际参数
         1.根据传入的第三个参数创建UIApplication对象
         2.根据传入的第四个产生创建UIApplication对象的代理
         3.设置刚刚创建出来的代理对象为UIApplication的代理
         4.开启一个事件循环
         */return UIApplicationMain(argc, argv, @"UIApplication", @"AppDelegate");
    }
} 

二、程序启动的完整过程

从main文件开始说起程序启动分为两类:1.有storyboard 2.没有storyboard

(一)有storyboard情况下:
1.main函数

2.UIApplicationMain

    - 创建UIApplication对象

    - 创建UIApplication的delegate对象

3.根据Info.plist获得最主要storyboard的文件名,加载最主要的storyboard(有storyboard)

    - 创建UIWindow

    - 创建和设置UIWindow的rootViewController

    - 显示窗口

(二)没有storyboard情况下:
1.main函数

2.UIApplicationMain

    - 创建UIApplication对象

    - 创建UIApplication的delegate对象

3.delegate对象开始处理(监听)系统事件(没有storyboard)

    - 程序启动完毕的时候, 就会调用代理的application:didFinishLaunchingWithOptions:方法

    - 在application:didFinishLaunchingWithOptions:中创建UIWindow

    - 创建和设置UIWindow的rootViewController

    - 显示窗口

Main方法的作用

1.根据第三个参数创建UIApplication对象,该对象为空就是默认创建UIApplication对象,该参数只能是UIApplication或者UIApplication的子类

该参数的写法可以有: nil,@“UIApplication”,NSStringFromClass([UIApplication class])

2.根据第四个参数创建应用程序代理,并将代理对象设置给application对象的delegate属性

3.开启时间循环,包括应用程序的循环运行,并开始处理用户事件

4.根据info.plist加载最主要的storyboard文件(默认是Main.storyboard,创建箭头指向的控制器(默认是viewController)


 

猜你喜欢

转载自blog.csdn.net/LIN1986LIN/article/details/86229832