程序的启动过程底层原理


UIApplication对象

  • 在程序启动的时候,系统帮我们创建的第一个对象就是UIApplication对象,它是一个单例对象
  • 常见属性
//显示应用右上角图标
@property(nonatomic) NSInteger applicationIconBadgeNumber;
//联网指示器可见
@property(nonatomic,getter=isNetworkActivityIndicatorVisible) BOOL networkActivityIndicatorVisible;
  • 常见用法
//跳转到打电话应用
UIApplication *app = [UIApplication sharedApplication];
[app openURL:[NSURL URLWithString:@"tel://10086"]];

启动程序的步骤

  • 1、程序的入口为main.m文件
#import 
#import "AppDelegate.h"
int main(int argc, char * argv[]) {
    @autoreleasepool {
        return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
    }
}
  • 2、UIApplicationMain函数所做的几件事情(参数的作用):
    • 1、nil参数:表示传进来的是UIApplication类或者是它的子类
    • 2、NSStringFromClass([AppDelegate class]):表是为应用程序创建一个代理对象,并将类名转为字符串传给函数,例如:AppDelegate.h和AppDelegate.m文件
    • 注意:这里也可以直接写@"AppDelegate",但是容易写错,而且编译器不会报错,所以最好用NSStringFromClass([AppDelegate class])
    • 3、在main.m中开启主事件循环(也可以理解为死循环),因为这样才能保持应用程序保持在运行状态
    • 4、加载Info.plist文件,看看Main storyboard file base name所要加载的storyboard文件,然后将该storyboard文件显示到屏幕上
      程序的启动过程底层原理_第1张图片
      Info
    • 5、程序启动完成,通知代理,然后调用application:didFinishLaunchingWithOptions:方法
    • 6、程序正常退出时UIApplicationMain函数才返回
  • 2.1、模拟系统加载storyboard文件的过程:
    • 系统会先创建一个窗口视图(UIWindow)
//注意:窗口要显示出来必须的步骤 1.强引用窗口 2.设置窗口的尺寸
self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
  • 加载storyboard文件,并且创建storyboard描述的控制器
UIViewController *vc = [[UIStoryboard storyboardWithName:@"Main" bundle:nil] instantiateInitialViewController];
  • 把storyboard描述的控制器设置为window的根控制器
//把控制器作为窗口的根控制器,就会把根控制器的View自动添加到窗口上
self.window.rootViewController = vc;
  • 设置window为主窗口并让其显示出来
[self.window makeKeyAndVisible];
//相当于做了下面两件事
//1.application.keyWindow = self.window
//2.self.window.hidden = NO;

UIApplication相关的几个生命周期方法

// 程序启动完成的时候调用,此时UIWindow只是创建出来而已,并没有马上显示出来
- (BOOL)application:(UIApplication *)applicationdidFinishLaunchingWithOptions:(NSDictionary *)launchOptions;

// 当应用程序失去焦点的时候调用(先失去焦点再进入后台)
- (void)applicationWillResignActive:(UIApplication *)application;

// 当应用程序进入后台的时候调用
- (void)applicationDidEnterBackground:(UIApplication *)application;// 一般在这个方法里面做一些保存数据的操作

// 当应用程序进入前台的时候调用
- (void)applicationWillEnterForeground:(UIApplication *)application;

// 当应用程序获取焦点的时候调用(先进入前台再获得焦点)
// 当用户完全获取焦点的时候,才能跟界面交互
- (void)applicationDidBecomeActive:(UIApplication *)application;

// 当应用程序关闭的时候调用
- (void)applicationWillTerminate:(UIApplication *)application;

// 当程序接收到内存警告的时候调用
- (void)applicationDidReceiveMemoryWarning:(UIApplication *)application;

UIWindow的相关知识点

  • iOS程序启动完毕后,创建的第一个视图控件就是UIWindow,接着创建控制器的view,最后将控制器的view添加到UIWindow上,于是控制器的view就显示在屏幕上了

  • 1、窗口要显示出来必须的步骤

    • 强引用窗口
    • 设置窗口的尺寸
self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
  • 2、一个应用程序至少会有一个UIWindow对象,但是这些UIWindow对象中,只能有一个能成为keyWindow。例如状态栏,键盘等都是窗口......

  • 3、窗口是有层级的,层级越高,就会优先显示在屏幕之上

    • UIWindowLevelAlert(2000层级) > UIWindowLevelStatusBar(1000层级)> UIWindowLevelNormal(0层级)
    • 由于层级是UIWindowLevel常量(CGFloat类型),所以优先级能进行加减

你可能感兴趣的:(程序的启动过程底层原理)