UIApplication

一、什么是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
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容