一、什么是UIApplication
- 每一个iOS应用程序都有一个UIApplication实例,而且是一个单例
- 通过[UIApplication sharedApplication] 就可以获取到UIApplicationd对象
- 一个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
网友评论