美文网首页
UIApplication

UIApplication

作者: Q2我没有疯 | 来源:发表于2018-04-16 02:17 被阅读0次

    一、什么是UIApplication

    1. 每一个iOS应用程序都有一个UIApplication实例,而且是一个单例
    2. 通过[UIApplication sharedApplication] 就可以获取到UIApplicationd对象
    3. 一个iOS程序启动后创建的第一个对象就是UIApplication对象
    • 程序启动的时候会执行main函数,main函数底层会调用UIApplicationMain函数,这个时候就创建了UIApplication对象
    #import <UIKit/UIKit.h>
    #import "AppDelegate.h"
    
    int main(int argc, char * argv[]) {
        @autoreleasepool {
            
            return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
        }
    }
    
    • UIApplicationMain函数底层实现

    1.函数根据principalClassName传入的类名创建UIApplication对象
    2.给UIApplication对象设置代理

     UIKIT_EXTERN int UIApplicationMain(int argc, char * _Nonnull * _Null_unspecified argv, NSString * _Nullable principalClassName, NSString * _Nullable delegateClassName);
      第一个参数argc:argv中的参数计数
      第二个参数argv:变量列表
      第三个参数principalClassName:UIApplication类或子类的名称。如果指定nil,则默认是UIApplication。
      第四个参数delegateClassName:用于实例化UIApplicationelegate类的名称。
    
      Main函数中的UIApplicationMain函数相当于
      return UIApplicationMain(argc, argv, @"UIApplication", @"AppDelegate");
        
    
    
     
    

    二、模仿苹果UIApplication单例

    苹果单例实现原理:
    1.外界不能调用alloc方法,一调用就会抛异常
    2.提供一个类方法获取实例
    3.在程序启动的时候在内部创建一次单例

    #import "YXApplication.h"
    
    @implementation YXApplication
    
    static YXApplication *_instance = nil;
    // 加载类的时候调用:每次程序一启动就会把所有的类加载进内存
    +(void)load{
    //    NSLog(@"%s",__func__);
        _instance = [[self alloc] init];
        
    }
    +(instancetype)sharedYXApplication{
        return _instance;
    }
    
    // 模仿苹果不让外界调用alloc方法,只要外界调用就抛异常
    +(instancetype)alloc{
        if (_instance) {
       
    // 创建一个异常对象     
     NSException *exception = [NSException exceptionWithName:@"NSInternalInconsistencyException" reason:@"There can only be one YXApplication instance." userInfo:nil];
            //  抛出异常
            [exception raise];
        }
        // [super alloc]:系统方法才知道怎么分配内存
        return [super alloc];
    }
    @end
    

    三、UIApplication作用:进行一些应用级别的操作

        // 1.设置应用程序图标的角标
        app.applicationIconBadgeNumber = 22;
        UIUserNotificationSettings *set = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge categories:nil];
        [app registerUserNotificationSettings:set];
        // 2.设置联网的指示器
        [UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
        // 3.设置状态栏:在iOS7之后状态栏默认交给控制器管理(如果不想让控制器管理需要在info.plist里添加View controller-based status bar appearance 设置为NO)
        [UIApplication sharedApplication].statusBarHidden = YES;
        // 4.打开网址:iOS10之后"Please use openURL:options:completionHandler: instead"(协议头: tel://打电话 sms://短信 mailto:// 邮件 http:// 网页)
        [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"http://www.baidu.com"]];
    

    四、UIApplicationDelegate

    代理能够处理的事件:

    • ->应用程序的生命周期事件(如程序启动和关闭)
    • ->系统事件(如来电)
    • ->内存警告

    代理方法:

    // 应用程序启动完成的时候调用
    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
    
    // 应用程序即将失去焦点的时候调用
    - (void)applicationWillResignActive:(UIApplication *)application 
    
    // 应用程序完全进入后台的时候调用
    - (void)applicationDidEnterBackground:(UIApplication *)application 
    
    // 应用程序完全即将进入后台的时候调用
    - (void)applicationWillEnterForeground:(UIApplication *)application 
    
    // 应用程序完全获取焦点的时候调用:(就是应用程序可以和用户交互的时候)
    - (void)applicationDidBecomeActive:(UIApplication *)application
    
    // 应用程序将要关闭的时候调用
    - (void)applicationWillTerminate:(UIApplication *)application
    

    相关文章

      网友评论

          本文标题:UIApplication

          本文链接:https://www.haomeiwen.com/subject/tffskftx.html