一、什么是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