程序启动

来源:互联网 发布:org.w3c.dom.node 编辑:程序博客网 时间:2024/05/18 02:29

程序启动

  • 程序启动
      • UIApplication单例
        • 1什么是UIApplication
        • 2UIApplication的作用
        • 3模仿一个UIApplication单例
      • UIApplication功能
        • 1app右上角标数字
        • 2连网状态
        • 3设置状态栏
          • 1由控制器设置状态栏
          • 2由UIApplication来设置状态栏
        • 4跳转
      • UIApplication代理
        • 1UIApplication的delegate的意义
        • 2UIApplication的delegate能处理的事情
        • 3代理监听app处在什么周期并在各个周期执行对应的方法
      • app启动
        • 1流程
        • 2main函数

UIApplication单例

1、什么是UIApplication?

  • UIApplication代表一个app

  • 每个app都有一个UIApplication对象,该对象由系统自动创建,是一个单例对象

  • app启动后创建的第一个对象就是UIApplication对象

  • 只能拿到(获取)这个UIApplication对象,不能创建,获取方法:

    [UIApplication sharedApplication]

2、UIApplication的作用?

  • 应用级别的操作
  • 设置app图标右上角标数字
  • 设置app状态栏
  • app之间的跳转

3、模仿一个UIApplication单例

要求

  • 程序一启动就创建对象
  • 只能通过share方法获取对象
  • 不可alloc操作,若alloc、则崩溃
//1、当类加载到内存后执行load方法、比main方法更先执行static Person *_instance;+ (void)load{  /**  创建的对象用成员属性保存,但类方法无法访问成员属性;  使用静态变量来保存创建的对象  */  //创建对象  _instance = [[self alloc] init];}//2、类方法sharePerson+ (instancetype)sharePerson{    return _instance;}//3、对这个类执行alloc方法会崩溃,可以重写alloc方法,+ (instancetype)alloc{  //当调用alloc方法,判断_instance是否有值,若有、抛出异常    if(_instance){    //创建异常    NSException *exception = [NSException exceptionWithName:@"NSInternalInconsistencyException"                                         reason:@"There can only be one Person instanca"                                         userinfo:nil];    //抛出异常    [exception raise];  }  //保持系统做法  return [super alloc];}

UIApplication功能

1、app右上角标数字

// iOS8之后 需先给app注册一个通知对象,才能接收提醒// 1、获取appUIApplication *app = [UIApplication sharedApplication];// 2、注册通知对象UIUserNotificationSettings *notice = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge categories:nil];[app registerUserNotificationSettings:notice];// 3、设置提醒数字app.applicationIconBadgeNumber = 10;

2、连网状态

// 获取appUIApplication *app = [UIApplication sharedApplication];//显示 状态栏上网络活动状态app.networkActivityIndicatorVisible = YES;

3、设置状态栏

3.1、由控制器设置状态栏
//在控制器中设置状态栏的样式- (UIStatusBarStyle)preferredStyleBarStyle{    return UIStatusBarStyleLightContent; }//在控制器中设置是否要隐藏状态栏- (BOOL)prefersStatusBarHidden{    // YES:隐藏   NO:不隐藏    return NO;}
3.2、由UIApplication来设置状态栏

默认是由控制器来设置状态栏,若要UIApplication控制,现在info.plist中取消控制器的权限

添加key view controller-based status bar appearance = NO

// 获取appUIApplication *app = [UIApplication sharedApplication];// 设置状态栏样式app.statusBarStyle = UIStatusBarStyleLightContent;// 设置状态栏是否隐藏app.statusBarHidden = YES;

4、跳转

// 获取appUIApplication *app = [UIApplication sharedApplication];/**URL 协议头://域名app根据协议头的类型去做域名对应的事情*/// 1、跳转链接 协议头 http[app openURL:[NSURL URLWithString:@"http://www.baidu.com"]];// 2、拨打电话 协议头 tel[app openURL:[NSURL URLWithString:@"tel://10086"]];// 3、发短信 协议头 sms[app openURL:[NSURL URLWithString:@"sms://10086"]];

UIApplication代理

UIApplication会在程序启动时候创建一个遵守协议的代理

1、UIApplication的delegate的意义

  • 处理系统事件,相当于助理(秘书)处理订票、业务之类的事情;

2、UIApplication的delegate能处理的事情:

  • app的生命周期事件(程序启动…关闭)
  • 系统事件(来电)
  • 内存警告

3、代理监听app处在什么周期,并在各个周期执行对应的方法

// app启动完成时,调用此方法- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions: (NSDictionary *)launchOptions {NSLog(@"%s",__func__);return YES;}// app即将失去焦点时 调 - (void)applicationWillResignActive:(UIApplication *)application {  NSLog(@"%s",__func__);}//app完全获取焦点的时候调(app完全获取到焦点,才能与户交互)- (void)applicationDidBecomeActive:(UIApplication *)application {   NSLog(@"%s",__func__);}//app完全进后台的时 调 - (void)applicationDidEnterBackground:(UIApplication *)application{  NSLog(@"%s",__func__);}// app即将进前台的时调 - (void)applicationWillEnterForeground:(UIApplication *)application {   NSLog(@"%s",__func__);}//app即将关闭时调用- (void)applicationWillTerminate:(UIApplication *)application { NSLog(@"%s",__func__);}

app启动

1、流程

  • 执行main函数
  • 执行UIApplicationMain函数
  • 创建UIApplication对象,并设置UIApplicationMain对象的代理
  • 开启住运动循环,保证程序不会退出
  • 加载info.plist,判断是否指定main,若指定、则加载Storyboard

2、main函数

程序启动默认执行main函数

int main(int argc, char * argv[]) {@autoreleasepool {/**第三个参数:UIApplication类名或者子类的名称 nil == @"UIApplication" 第四个参数:UIApplication的代理的代理名称         NSStringFromClass:把类名转化字符串         NSStringFromClass好处:1.有提示功能 2.避免输入错误*/return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); }}