zoukankan      html  css  js  c++  java
  • iOS程序启动原理

    UIApplication

    一个iOS程序启动后创建的第一个对象就是UIApplication对象

    利用UIApplication对象,能进行一些应用级别的操作

    UIApplication是单例对象

    • 不能进行重新初始化,比如[[UIApplication alloc] init],会直接报错的
    错误写法
     // reason: 'There can only be one UIApplication instance.'
    // 原因:这儿只能有一个UIApplication实例
    UIApplication *app =  [[UIApplication alloc] init];
    
    • 得到当前的UIApplication
    UIApplication *app = [UIApplication sharedApplication];
    

    设置图标提醒数

    • set to 0 to hide. default is 0. In iOS 8.0 and later, your application must register for user notifications using -[UIApplication registerUserNotificationSettings:] before being able to set the icon badge.
    • 如果设置是0,那么将会隐藏数字,默认就是0。在iOS8及之后,你在设置icon badge之前,必须注册一个-UIApplication registerUserNotificationSettings:
    // 创建UIUserNotificationSettings
    UIUserNotificationSettings *setting = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge categories:nil];
    // 注册用户通知
    [app registerUserNotificationSettings:setting];
    // 设置图标提醒数
    app.applicationIconBadgeNumber = 10;
    

    设置网络请求状态

    • 设为YES,将在状态栏处显示网络请求状态
    app.networkActivityIndicatorVisible = YES;
    

    设置隐藏状态栏

    • Setting statusBarHidden does nothing if your application is using the default UIViewController-based status bar system.
    • 如果你设置了使用默认的UIViewController-based管理状态栏,那么即使设置了setStatusBarHidden,也不会隐藏状态栏
    • 如果想要隐藏状态栏,可以使用-prefersStatusBarHidden方法
    • 如果在info.plist中,设置View controller-based status bar appearance 为NO,那么就是把状态栏管理交给UIApplication,下面这行代码就生效了
    [app setStatusBarHidden:YES];
    [app setStatusBarHidden:YES withAnimation:UIStatusBarAnimationFade];
    

    打开指定URL

    • URL:协议头://域名+路径 http,https,file,tel
    -NSURL *url = [NSURL URLWithString:@"http://www.baidu.com"];
    [[UIApplication sharedApplication] openURL:url];
    

    UIApplicationDelegate

    /** 应用程序加载完毕 */
    - (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 {
        UIApplication *app = [UIApplication sharedApplication];
        UIUserNotificationSettings *setting = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge categories:nil];
        [app registerUserNotificationSettings:setting];
        app.applicationIconBadgeNumber = 0;
        NSLog(@"%s", __func__);
    }
    
    /** 应用程序获得焦点 */
    - (void)applicationDidBecomeActive:(UIApplication *)application {
        NSLog(@"%s", __func__);
    }
    
    /** 程序将要关闭 */
    - (void)applicationWillTerminate:(UIApplication *)application {
        [self saveContext];
    
    }
    
    
    • 在Xcode中run程序的时候
      • -[AppDelegate application:didFinishLaunchingWithOptions:]

    -[AppDelegate applicationDidBecomeActive:]

    • 然后点击home键

      • -[AppDelegate applicationWillResignActive:]
      • -[AppDelegate applicationDidEnterBackground:]
    • 然后点击桌面的应用程序图标再次进入程序

      • -[AppDelegate applicationWillEnterForeground:]
      • -[AppDelegate applicationDidBecomeActive:]

    UIApplicationMain

    • main函数中执行了一个UIApplicationMain这个函数
    int UIApplicationMain(int argc, char *argv[], NSString *principalClassName, NSString *delegateClassName);
    
    • argc、argv:直接传递给UIApplicationMain进行相关处理即可
    • principalClassName:指定应用程序类名(app的象征),该类必须是UIApplication(或子类)。如果为nil,则用UIApplication类作为默认值
    • delegateClassName:指定应用程序的代理类,该类必须遵守UIApplicationDelegate协议

    应用程序启动原理

    • 打开程序
    • 执行main函数(程序入口)
    • 执行UIApplicationMain函数
      • 创建UIApplication
      • 创建UIApplicationDelegate,并使之成为UIApplication的代理
      • 开启主运行循环,接收时间
      • 加载info.plist,判断是否有main.storyboard,有就加载

    加载main.storyboard

    • 创建UIWIndow
    • 加载main.storyboard,并且加载main.storyboard制定的控制器
    • 把新创建的控制器作为窗口的根控制器,并让窗口显示出来

    UIWindow

    • UIWindow是一种特殊的UIView

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

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

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

    添加UIView到UIWindow中两种常见方式:

    • -(void)addSubview:(UIView *)view;

      • 直接将view添加到UIWindow中,但并不会理会view对应的UIViewController
    • @property(nonatomic,retain) UIViewController *rootViewController;

      • 自动将rootViewController的view添加到UIWindow中,负责管理rootViewController的生命周期

    常用方法

    • -(void)makeKeyWindow;
      让当前UIWindow变成keyWindow(主窗口)

    • -(void)makeKeyAndVisible;
      让当前UIWindow变成keyWindow,并显示出来

    UIWindow的获得

    • [UIApplication sharedApplication].windows

      • 在本应用中打开的UIWindow列表,这样就可以接触应用中的任何一个UIView对象
        (平时输入文字弹出的键盘,就处在一个新的UIWindow中)
    • [UIApplication sharedApplication].keyWindow

      • 用来接收键盘以及非触摸类的消息事件的UIWindow,而且程序中每个时刻只能有一个UIWindow是keyWindow。如果某个UIWindow内部的文本框不能输入文字,可能是因为这个UIWindow不是keyWindow
    • view.window

      • 获得某个UIView所在的UIWindow
  • 相关阅读:
    java几种数据的默认扩容机制
    web.xml配置详解
    Bootstrap文件上传组件
    JAVA四则运算算法
    Oracle 和 mysql 的批量操作Sql语句 的区别
    JAVA使用ItextPDF
    c# 状态机实现
    c++11模拟boost元占位符placeholder
    vs2012 函数参数内存对齐引发编译错误
    windows下matplotlib编译安装备忘
  • 原文地址:https://www.cnblogs.com/coderAlin/p/4751807.html
Copyright © 2011-2022 走看看