標籤:
程式啟動-生命週期
來自: QQ: 853740091
1.首先講解UIApplication對象
(1)UIApplication對象是應用程式的象徵,一個UIApplication對象就代表一個應用程式。
(2)每一個應用都有自己的UIApplication對象,而且是單例的,如果試圖在程式中建立一個UIApplication對象,那麼將報錯提示。
(3)通過[UIApplicationsharedApplication]可以獲得這個單例對象
(4) 一個iOS程式啟動後建立的第一個對象就是UIApplication對象,且只有一個(通過代碼擷取兩個UIApplication對象,列印地址可以看出地址是相同的)。
(5)利用UIApplication對象,能進行一些應用層級的操作
1.1 應用層級的操作樣本:
1)設定應用程式圖示右上方的紅色提醒數字(如QQ訊息的時候)
2)設定app連網時候的載入小菊花
3)管理狀態列 就是app最上邊的訊號等
4)openURL: 最常用的點擊一個按鈕跳到app stroe的下載介面、還有發簡訊、發郵件等
UIApplication對象會不斷的檢測應用程式的目前狀態。當系統修改了應用程式的目前狀態,會發送通知,UIApplication對象就會檢測到這個通知。
2. UIApplication Delegate
2.1.簡單說明
所有的移動作業系統都有個致命的缺點:app很容易受到打擾。比如一個來電或者鎖屏會導致app進入後台甚至被終止。還有很多其它類似的情況會導致app受到幹擾,在app受到幹擾時,會產生一些系統事件,這時UIApplication會通知它的delegate對象,讓delegate代理來處理這些系統事件。
每次建立完項目,都有個帶有“AppDelegate”字眼的類,它就是UIApplication的代理 遵守協議<UIApplicationDelegate>
2.2 代理方法
// 當應用程式啟動完畢的時候就會調用(系統自動調用)
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
NSLog(@"didFinishLaunchingWithOptions");
return YES;
}
// 即將失去活動狀態的時候調用(失去焦點, 不可互動)
- (void)applicationWillResignActive:(UIApplication *)application
{
NSLog(@"ResignActive");
}
// 重新擷取焦點(能夠和使用者互動)
- (void)applicationDidBecomeActive:(UIApplication *)application
{
NSLog(@"BecomeActive");
}
// 應用程式進入背景時候調用
// 一般在該方法中儲存應用程式的資料, 以及狀態
- (void)applicationDidEnterBackground:(UIApplication *)application
{
NSLog(@"Background");
}
// 應用程式即將進入前台的時候調用
// 一般在該方法中恢複應用程式的資料,以及狀態
- (void)applicationWillEnterForeground:(UIApplication *)application
{
NSLog(@"Foreground");
}
// 應用程式即將被銷毀的時候會調用該方法
// 注意:如果應用程式處於掛起狀態的時候無法調用該方法
- (void)applicationWillTerminate:(UIApplication *)application
{
}
// 應用程式接收到記憶體警告的時候就會調用
// 一般在該方法中釋放掉不需要的記憶體
- (void)applicationDidReceiveMemoryWarning:(UIApplication *)application
{
NSLog(@"MemoryWarning");
}
3. 程式啟動原理
int main(int argc, char * argv[]) {
@autoreleasepool {
return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
}
}
int argc, char * argv[] 這兩個參數包含應用程式何時啟動等資訊(系統傳入的參數)
@autoreleasepool 緩衝池,對象引用計數自動處理器 新產生一個Run Loop的時候,系統會自動的建立一個NSAutoreleasePool,該NSAutoreleasePool無法被刪除
第三個參數:主要是檢測程式的狀態(指的是系統改變了程式的目前狀態)的改變。必須傳入UIApplication子類,如果傳入nil系統會自動建立一個UIApplication對象
第四個參數:app程式的代理。第三個參數檢測到程式狀態的改變,就會通知代理。。然後我們在相應的方法中處理事情。
注意: 程式退出時 main函數才會返回。否則一個處於一個死迴圈狀態
4.程式啟動的完整過程
1).main函數
2).UIApplicationMain
* 建立UIApplication對象
* 建立UIApplication的delegate對象
3).delegate對象開始處理(監聽)系統事件(沒有storyboard)
* 程式啟動完畢的時候, 就會調用代理的application:didFinishLaunchingWithOptions:方法
* 在application:didFinishLaunchingWithOptions:中建立UIWindow
* 建立和設定UIWindow的rootViewController
* 顯示視窗
4).根據Info.plist獲得最主要storyboard的檔案名稱,載入最主要的storyboard(有storyboard)
* 建立UIWindow
* 建立和設定UIWindow的rootViewController
* 顯示視窗
2. iOS程式的生命週期