zoukankan      html  css  js  c++  java
  • (三十三)UIApplicationDelegate和程序的启动过程

    移动操作系统有个致命弱点,是app容易受到干扰(来电或者锁屏)。

    当app受到干扰时,会产生一系列的系统事件,这时UIApplication会通知其delegate对象,让delegate处理系统事件。

    delegate可以处理生命周期事件、系统事件、内存警告等。

    ApplicationDelegate已经遵循了UIApplicationDelegate协议,直接在ApplicationDelegate的实现中写代码即可应对各种app的干扰。

    常用的是:

    application: didFinishLaunchingWithOptions:   自程序启动第一次加载完毕后就调用

    applicationDidEnterBackground:                       进入后台时调用

    applicationDidEnterForeground:                       进入前台时调用

    applicationDidReceiveMemoryWarning:           内存警告时调用

    注意,其中的BecomeActive和ResignActive指的是获得和失去焦点。

    程序执行步骤:入口为main.m,然后执行UIApplicationMain(类似一个死循环)直到返回。

    int main(int argc, char * argv[])
    {
        @autoreleasepool {
            return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
        }
    }
    UIApplicationMain会初始化UIApplication,创建和设置代理对象,并开启事件循环。

    当队列不空时,会不断从队列中取出队头事件来处理。如果监听到系统事件,就会去调用代理方法。

    UIKIT_EXTERN int UIApplicationMain(int argc, char *argv[], NSString *principalClassName, NSString *delegateClassName);
    前两个参数是从main()得到的命令行参数;第三个参数是最主要的类名,一般是UIApplication的类名,写nil以UIApplication为默认值;

    第四个参数为UIApplication的代理,必须遵循UIApplicationDelegate协议。

    NSStringFromClass方法,写[<#类名#> class] 作为参数即可实现将类名转字符串,可以降低出错率。

    UIWindow是一种特殊的UIView,通常情况下在一个app中只有一个UIWindow。

    iOS程序启动后,创建的第一个视图控件是UIWindow,接着把view添加到UIWindow上。

    Tip:没有UIWindow就没有UI界面,

    底层的操作是:初始化一个要显示的View,然后通过UIWindow的addSuberview方法加入到Window上,只有UIWindow调用makeKeyAndVisible才能显示。

    建议通过self.window的rootViewController属性来设置控制器,因为直接添加Suberview得不到控制器信息,那么视图改变(例如屏幕旋转)时无法调用控制器。

    结构层次:


    Tip:要显示哪个窗口,就让UIWindow的控制器为哪个UIView。

    使用storyboard会屏蔽UIView添加到UIWindow的过程,并且会让箭头指向的控制器作为rootViewController,最后这个window会作为ApplicationDelegate的一个成员变量。

    Mainstoryboard的加载步骤:

    初始化一个window->加载initial view->将这个view配置到window的rootViewController。


  • 相关阅读:
    字典或者数组与JSON串之间的转换
    银联支付 支付代码
    iOS 一个新方法:- (void)makeObjectsPerformSelector:(SEL)aSelector;
    iOS 直接使用16进制颜色
    iOS 添加view的分类(更加方便的设置view的位置)
    iOS 中UITableView的深理解
    Swift 中调试状态下打印日志
    手把手教React Native实战开发视频教程【更新到40集啦。。。】
    React Native 开发
    React-Native学习指南
  • 原文地址:https://www.cnblogs.com/aiwz/p/6154218.html
Copyright © 2011-2022 走看看