iOS UIApplication & delegate & 应用程序启动原理 & UIWindow

245 阅读4分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第3天,点击查看活动详情

Xcode5与Xcode7的区别

1.Xcode5有个FrameWorks,存放框架。 Xcode7 自动导入框架,用到什么框架时,自动导入框架。 2.Xcode7当中多了一个LaunchScreen.storyboard,用来设置启动页面,如果没有设置启动页面,默认它的屏幕的大小是4s大小。 LaunchScreen底层实现:把LaunchScreen.storyboard当中内容,生成一张图片。 3. info.plist,名称发生了变化,而且放到了外面。 4. 在Xcode7当中没有了PCH文件

PCH 文件

iOS_test/PrefixHeader.pch

截屏2022-04-07 上午10.40.42.png

UIApplication

一个iOS程序启动后创建的第一个对象就是UIApplication对象。 他是一个单例 利用它可以,进行一些应用级别的操作。

UIApplication 的常用属性

设置应用程序图标右上角的红色提醒文字 applicationIconBadgeNumber;

设置联网指示器的可见性 networkActivityIndicatorVisible;

iOS7中的状态栏 从iOS7开始,系统提供了2种管理状态栏的方式 通过UIViewController管理,每一个UIViewController都可以拥有自己不同的状态栏。 通过UIApplication管理(一个应用程序的状态栏都由他统一管理)

在iOS7中,默认情况下,状态栏都由UIViewController管理的,UIViewController实现下列方法就可以轻松管理状态栏的可见性和样式。 状态栏的样式

preferredStatusBarStyle;

状态栏的可见性 prefersStatusBarHidden;

UIApplication 和 delegate

所有的移动操作系统都有个致命的缺点:app很容易受到打扰,比如一个 来电或者锁屏会导致app进入后台甚至被终止。

还有很多其他类似的情况会导致app受到干扰,在app受到干扰时,会产生一些系统事件,这时UIApplication会通知它的delegate对象,让delegate代理来处理这些系统事件。

delegate可处理的事件包括: 应用程序的生命周期(如程序启动和关闭) 系统事件(如来电) 内存警告

截屏2022-04-07 下午1.56.38.png

// 应用程序启动完成时调用

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

\


    NSLog(@"%s",__func__);

    return YES;

}

// 应用程序将要失去焦点时调用

- (void)applicationWillResignActive:(UIApplication *)application

{

    NSLog(@"%s",__func__);

}

// 应用程序进入后台时调用

- (void)applicationDidEnterBackground:(UIApplication *)application{

    NSLog(@"%s",__func__);

}

// 应用程序进入前台时调用

- (void)applicationWillEnterForeground:(UIApplication *)application

{

    NSLog(@"%s",__func__);

}

// 应用程序获取焦点

- (void)applicationDidBecomeActive:(UIApplication *)application

{

    NSLog(@"%s",__func__);

}

// 当应用程序退出的时候调用

- (void)applicationWillTerminate:(UIApplication *)application

{

    NSLog(@"%s",__func__);

}

// 当应用程序收到内存警告时调用

- (void)applicationDidReceiveMemoryWarning:(UIApplication *)application

{

    // 清理缓存,图片,视频

    NSLog(@"%s",__func__);

}

应用程序启动原理

int main(int argc, char * argv[]) {

    NSString * appDelegateClassName;

    @autoreleasepool {

        // Setup code that might create autoreleased objects goes here.

        appDelegateClassName = NSStringFromClass([AppDelegate class]);

    }

    // 第三个参数:设置是应用程序对象的名称UIApplication

    // 或者是它的子,如果是nil,默认是UIApplication

    // 第四个参数:

    // NSStringFromClass: 将类名转成字符串。

    return UIApplicationMain(argc, argv, nil, appDelegateClassName);

    /**

     1. 执行main函数

     2. 执行UIApplicationMain, 创建UIApplication对象,并设置UIApplication它的代理。

     3. 开启一个事件循环,(主运行循环,死循环:保证用户不退出)

     4. 去加载info.plist文件(判断info.plist文件中有没有Main,如果有,去加载Main.storyboard)

     5.应用程序启动完毕。(通知代理应用程序启动完毕)

     */

}

截屏2022-04-07 下午2.31.12.png

UIWindow

UIWindow 是一种特殊的UIView,通常在一个app中至少有一个UIWindow iOS程序启动完毕后,创建的第一个试图控件就是UIWindow,接着创建控制器的view, 最后将控制器的view添加到UIWindow上,于是控制器的view就显示在屏幕上了。

一个iOS 程序之所以能显示到屏幕上,完全是因为它有UIWindow

也就是说,没有UIWindow,就看不见任何UI界面。

  1. 如果有Main,他会加载Main.storyBoard。
  2. 先创建一个窗口
  3. 把Main.storyBoard,箭头指向的控制器,设为窗口的跟控制器。
  4. 显示窗口(把窗口的跟控制器的View,添加到窗口)
#import "AppDelegate.h"

@interface AppDelegate ()
@property (strong, nonatomic) UIWindow *window1;
@end

@implementation AppDelegate


// 应用程序启动完成时调用

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

    // 1. 创建窗口
    self.window = [[UIWindow alloc] initWithFrame:CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, [UIScreen mainScreen].bounds.size.height)];
    // 2. 一个窗口必须得有跟控制器(设置窗口的跟控制器)
    UIViewController *vc = [[UIViewController alloc] init];
    vc.view.backgroundColor = [UIColor redColor];
    self.window.rootViewController = vc;
    // 3. 显示
    [self.window makeKeyAndVisible];
    NSLog(@"%s",__func__);

    /**
     makeKeyAndVisible
     1. 设置应用程序的主窗口
     2. 让窗口显示,把窗口hidden = no
     3. 把窗口的跟控制器的view添加到窗口上
     [self.window addsubView:rootViewController.view];
     */

    // 键盘状态栏,其实都是UIWindow
    self.window1 = [[UIWindow alloc] initWithFrame:CGRectMake(0, 20, 375, 40)];
    UIViewController *vc1 = [[UIViewController alloc] init];
    vc1.view.backgroundColor = [UIColor blueColor];
    self.window1.rootViewController = vc1;
    [self.window1 makeKeyAndVisible];

    // 设置窗口层级
    //UIWindowLevelAlert > UIWindowLevelStatusBar > UIWindowLevelNormal
    self.window1.windowLevel = UIWindowLevelStatusBar;
    self.window.windowLevel = UIWindowLevelAlert;
    return YES;
}


@end