代码改变世界

iOS程序启动原理

2015-06-24 01:03  Say_ALin  阅读(498)  评论(0)    收藏  举报

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