天天看點

iOS程式的啟動原理

說起程式的啟動原理,首先要了解的是:

UIApplication

1.什麼是UIApplication?

UIApplication對象是應用程式的象征,每一個應用都有自己的UIApplication對象,而且是單例,通過

[UIApplication sharedApplication]

來獲得這個單例對象

2.UIApplication的常見屬性

① 設定應用程式圖示右上角的紅色提醒數字

@property(nonatomic,assign) NSInteger applicationIconBadgeNumber;
           

示範:

首先要在application裡面注冊icon的badge的修改權限:

UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge categories:nil];
[application registerUserNotificationSettings:settings];
           

然後再設定提醒的數字:

如圖:

iOS程式的啟動原理
②設定聯網訓示器可見性
           
[UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
           
3.UIApplication的強大功能:openURL

部分功能有:
① 打電話:
           
UIApplication *app = [UIApplication sharedApplication];
[app openURL:[NSURL URLWithString:@"tel://10086"]];
           
② 發短信
           
[app openURL:[NSURL URLWithString:@"sms://10086"]];
           
③ 發郵件
           
[app openURL:[NSURL URLWithString:@"mailto://[email protected]"]];
           
④ 打開網頁
           
[app openURL:[NSURL URLWithString:@"www.baidu.com"]];
           
⑤ 打開其他app
           

然後了解的是UIApplicationDelegate

打開程式中的AppDelegate.h發現:

發現有個UIApplicationDelegate,這個是幹什麼的?

所有的移動作業系統都有一個緻命的缺點: app很容易受到打擾。比如一個來電或者鎖屏會導緻app進入背景甚至被終止。

還有很多其他類似的情況會導緻app受到幹擾,在app受到幹擾時,會産生一些系統事件,這時UIApplication會通知它的delegate對象,讓delegate代理來處理這些系統事件。

① UIApplication有一個delegate屬性

② UIApplication的delegate的對象必須遵循UIApplicationDelegate協定

③ UIApplicationDelegate協定可以知道程式的運作狀态

//程式啟動完成

- (BOOL)application:(UIApplication )application didFinishLaunchingWithOptions:(NSDictionary )launchOptions {

NSLog(@"程式啟動完成");
return YES;
           

}

  • (void)applicationWillResignActive:(UIApplication *)application {

    NSLog(@”程式将失去焦點”);

    }

  • (void)applicationDidEnterBackground:(UIApplication *)application {

    NSLog(@”程式将進入背景”);

    }

  • (void)applicationWillEnterForeground:(UIApplication *)application {

    NSLog(@”程式将進入前台”);

    }

  • (void)applicationDidBecomeActive:(UIApplication *)application {

    NSLog(@”程式将出現焦點”);

    }

  • (void)applicationWillTerminate:(UIApplication *)application {

    NSLog(@”程式結束”);

    }“

每個程式都有一個main函數,ios的main函數

int main(int argc, char * argv[]) {
    @autoreleasepool {
        return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
    }
}
           

main函數中執行了一個UIApplicationMain這個函數

int UIApplicationMain(int argc,char *argv[],NSString *principalClassName,NSString *delegateClassName);
           

① argc、argv:直接傳遞給UIApplicationMain進行相關處理即可

② principalClassName:指定應用程式類名(app的象征),該類必須是UIApplication(或子類)。如果為nil,則用UIApplication類作為預設值

③ delegateClassName:指定應用程式的代理類,該類必須遵守UIApplicationDelegate協定

④ UIApplicationMain函數會根據principalClassName建立UIApplication對象,根據delegateClassName建立一個delegate對象,并将該delegate對象指派給UIApplication對象中的delegate屬性

⑤ 接着會建立應用程式的Main Runloop(事件循環),進行事件的處理(首先會在程式完畢後調用delegate對象的application:didFinishLaunchingWithOptions:方法)

⑥ 程式正常退出時UIApplicationMain函數才傳回

iOS程式的啟動原理

這就是整個的ios啟動原理。