UIApplication

一、什么是UIApplication

  1. 每一個(gè)iOS應(yīng)用程序都有一個(gè)UIApplication實(shí)例,而且是一個(gè)單例
  2. 通過(guò)[UIApplication sharedApplication] 就可以獲取到UIApplicationd對(duì)象
  3. 一個(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
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • *面試心聲:其實(shí)這些題本人都沒(méi)怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個(gè)offer,總結(jié)起來(lái)就是把...
    Dove_iOS閱讀 27,653評(píng)論 30 472
  • 一、深復(fù)制和淺復(fù)制的區(qū)別? 1、淺復(fù)制:只是復(fù)制了指向?qū)ο蟮闹羔槪磧蓚€(gè)指針指向同一塊內(nèi)存單元!而不復(fù)制指向?qū)ο蟮?..
    iOS_Alex閱讀 1,535評(píng)論 1 27
  • 題目: There are a total of n courses you have to take, labe...
    小豬正在追閱讀 430評(píng)論 0 0
  • 近期蘋(píng)果公司iOS 9系統(tǒng)策略更新,限制了http協(xié)議的訪問(wèn),此外應(yīng)用需要在“Info.plist”中將要使用的U...
    ZeroIG閱讀 48,419評(píng)論 19 41
  • 遙望山隔水, 岸春綠柳垂; 絳絲拂去客, 渺渺飛雁歸。
    一劍飄紅10917閱讀 276評(píng)論 0 0

友情鏈接更多精彩內(nèi)容