說起程式的啟動原理,首先要了解的是:
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];
然後再設定提醒的數字:
如圖:
②設定聯網訓示器可見性
[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啟動原理。