美文网首页
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