一、什么是UIApplication
- 每一個(gè)iOS應(yīng)用程序都有一個(gè)UIApplication實(shí)例,而且是一個(gè)單例
- 通過(guò)[UIApplication sharedApplication] 就可以獲取到UIApplicationd對(duì)象
- 一個(gè)iOS程序啟動(dòng)后創(chuàng)建的第一個(gè)對(duì)象就是UIApplication對(duì)象
- 程序啟動(dòng)的時(shí)候會(huì)執(zhí)行main函數(shù),main函數(shù)底層會(huì)調(diào)用UIApplicationMain函數(shù),這個(gè)時(shí)候就創(chuàng)建了UIApplication對(duì)象
#import <UIKit/UIKit.h>
#import "AppDelegate.h"
int main(int argc, char * argv[]) {
@autoreleasepool {
return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
}
}
- UIApplicationMain函數(shù)底層實(shí)現(xiàn)
1.函數(shù)根據(jù)principalClassName傳入的類名創(chuàng)建UIApplication對(duì)象
2.給UIApplication對(duì)象設(shè)置代理
UIKIT_EXTERN int UIApplicationMain(int argc, char * _Nonnull * _Null_unspecified argv, NSString * _Nullable principalClassName, NSString * _Nullable delegateClassName);
第一個(gè)參數(shù)argc:argv中的參數(shù)計(jì)數(shù)
第二個(gè)參數(shù)argv:變量列表
第三個(gè)參數(shù)principalClassName:UIApplication類或子類的名稱。如果指定nil,則默認(rèn)是UIApplication。
第四個(gè)參數(shù)delegateClassName:用于實(shí)例化UIApplicationelegate類的名稱。
Main函數(shù)中的UIApplicationMain函數(shù)相當(dāng)于
return UIApplicationMain(argc, argv, @"UIApplication", @"AppDelegate");
二、模仿蘋(píng)果UIApplication單例
蘋(píng)果單例實(shí)現(xiàn)原理:
1.外界不能調(diào)用alloc方法,一調(diào)用就會(huì)拋異常
2.提供一個(gè)類方法獲取實(shí)例
3.在程序啟動(dòng)的時(shí)候在內(nèi)部創(chuàng)建一次單例
#import "YXApplication.h"
@implementation YXApplication
static YXApplication *_instance = nil;
// 加載類的時(shí)候調(diào)用:每次程序一啟動(dòng)就會(huì)把所有的類加載進(jìn)內(nèi)存
+(void)load{
// NSLog(@"%s",__func__);
_instance = [[self alloc] init];
}
+(instancetype)sharedYXApplication{
return _instance;
}
// 模仿蘋(píng)果不讓外界調(diào)用alloc方法,只要外界調(diào)用就拋異常
+(instancetype)alloc{
if (_instance) {
// 創(chuàng)建一個(gè)異常對(duì)象
NSException *exception = [NSException exceptionWithName:@"NSInternalInconsistencyException" reason:@"There can only be one YXApplication instance." userInfo:nil];
// 拋出異常
[exception raise];
}
// [super alloc]:系統(tǒng)方法才知道怎么分配內(nèi)存
return [super alloc];
}
@end
三、UIApplication作用:進(jìn)行一些應(yīng)用級(jí)別的操作
// 1.設(shè)置應(yīng)用程序圖標(biāo)的角標(biāo)
app.applicationIconBadgeNumber = 22;
UIUserNotificationSettings *set = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge categories:nil];
[app registerUserNotificationSettings:set];
// 2.設(shè)置聯(lián)網(wǎng)的指示器
[UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
// 3.設(shè)置狀態(tài)欄:在iOS7之后狀態(tài)欄默認(rèn)交給控制器管理(如果不想讓控制器管理需要在info.plist里添加View controller-based status bar appearance 設(shè)置為NO)
[UIApplication sharedApplication].statusBarHidden = YES;
// 4.打開(kāi)網(wǎng)址:iOS10之后"Please use openURL:options:completionHandler: instead"(協(xié)議頭: tel://打電話 sms://短信 mailto:// 郵件 http:// 網(wǎng)頁(yè))
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"http://www.baidu.com"]];
四、UIApplicationDelegate
代理能夠處理的事件:
- ->應(yīng)用程序的生命周期事件(如程序啟動(dòng)和關(guān)閉)
- ->系統(tǒng)事件(如來(lái)電)
- ->內(nèi)存警告
代理方法:
// 應(yīng)用程序啟動(dòng)完成的時(shí)候調(diào)用
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
// 應(yīng)用程序即將失去焦點(diǎn)的時(shí)候調(diào)用
- (void)applicationWillResignActive:(UIApplication *)application
// 應(yīng)用程序完全進(jìn)入后臺(tái)的時(shí)候調(diào)用
- (void)applicationDidEnterBackground:(UIApplication *)application
// 應(yīng)用程序完全即將進(jìn)入后臺(tái)的時(shí)候調(diào)用
- (void)applicationWillEnterForeground:(UIApplication *)application
// 應(yīng)用程序完全獲取焦點(diǎn)的時(shí)候調(diào)用:(就是應(yīng)用程序可以和用戶交互的時(shí)候)
- (void)applicationDidBecomeActive:(UIApplication *)application
// 應(yīng)用程序?qū)⒁P(guān)閉的時(shí)候調(diào)用
- (void)applicationWillTerminate:(UIApplication *)application