iPhone應用程序生命周期講解
iPhone應用程序生命周期講解是本文要介紹的內容,不多說,直接進入話題。iPhone應用程序是由主函數main啟動,它負責調用UIApplicationMain函數,該函數的形式如下所示:
- int UIApplicationMain (int argc,char *argv[], NSString *principalClassName, NSString *delegateClassName);
那么UIApplicationMain函數到底做了哪些事情呢?這個函數主要負責三件事情:
(1)從給定的類名初始化應用程序對象,也就是初始化UIApplication或者子類對象的一個實例,如果你在這里給定的是nil,那么系統會默認UIApplication類,也就主要是這個類來控制以及協調應用程序的運行。在后續的工作中,你可以用靜態方法sharedApplication 來獲取應用程序的句柄。
(2)從給定的應用程序委托類,初始化一個應用程序委托。并把該委托設置為應用程序的委托,這里就有如果傳入參數為nil,會調用函數訪問 Info.plist文件來尋找主nib文件,獲取應用程序委托。
(3)啟動主事件循環,并開始接收事件。
上面是UIApplicationMain函數的工作,接下來一個問題是應用程序視圖的顯示、消息的控制怎么辦?下面就是UIApplication(或者子類)對象的職責,這個對象主要做下面幾件事:
(1)負責處理到來的用戶事件,并分發事件消息到應該處理該消息的目標對象(sender, action)。
(2)管理以及控制視圖,包括呈現、控制行為、當前顯示視圖等。
(3)該對象有一個應用程序委托對象,當一些生命周期內重要事件(可以包括系統事件或者生命周期控制事件)發生時,應用程序通知該對象。例如,應用程序啟動、內存不夠了或者應用程序結束等,讓這些事件發生時,應用程序委托去響應。
通過上面的分析,可以知道UIApplication對開發者來說,是一個黑箱,它也可以是。因為所有的操作,都可以由它的委托來幫我們完成,它只需要在后面維護一些不可更改的東西,如事件消息分發和傳遞、給委托發送事件處理請求等等,如,應用程序加載處理完畢,它會發送消息給委托,然后委托可以在 applicationDidFinishLanching委托函數中去實現開發者想要的動作。利用XCODE在創建應用程序時,會默認實現一個應用程序委托類。而對于加載的視圖,則有視圖相關的委托類來處理視圖加載過程的生命事件。下面說明委托主要可以辦哪些事情:
控制應用程序的行為
- - (void)applicationDidFinishLaunching:(UIApplication *)application
應用程序啟動完畢。
- - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
當由于其它方法打開應用程序(如URL指定或者連接),通知委托啟動完畢
- - (void)applicationWillTerminate:(UIApplication *)application
通知委托,應用程序將在關閉 退出,請做一些清理工作。
- - (void)applicationDidReceiveMemoryWarning:(UIApplication *)application
通知委托,應用程序收到了為來自系統的內存不足警告。-(void)applicationSignificantTimeChange:(UIApplication *)application
通知委托系統時間發生改變(主要是指時間屬性,而不是具體的時間值)
打開URL
- - (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url
打開指定的URL
控制狀態欄方位變化
- – application:willChangeStatusBarOrientation:duration:
設備方向將要發生改變
- – application:didChangeStatusBarOrientation:
活動狀態改變
- - (void)applicationWillResignActive:(UIApplication *)application
通知委托應用程序將進入非活動狀態,在此期間,應用程序不接收消息或事件。-(void)applicationDidBecomeActive:(UIApplication *)application
通知委托應用程序進入活動狀態,請恢復數據
可以看到UIApplication的頭文件實現
- @interface UIApplication :UIResponder <UIActionSheetDelegate>{
- @package
- id<UIApplicationDelegate> _delegate ; //這就是應用程序委托。
- NSTimer .......
- }
因此,在UIApplication中處理的系統事件時,只需轉到_delegate這個類去處理,這個類對象就是應用程序委托對象。我們可以從應用程序的單例類對象中得到應用程序委托的對象
UIApplicationDelegate* myDelegate = [[UIApplication sharedApplication] delegate];
UIApplication接收到所有的系統事件和生命周期事件時,都會把事件傳遞給UIApplicationDelegate進行處理,對于用戶輸入事件,則傳遞給相應的目標對象去處理。比如我們在應用程序被來電等消息后,可以調用應用程序委托類的 applicationWillResignActive()方法,這個方法在用戶鎖住屏幕時,也會調用,與之相適應的是應用程序重新被用戶打開時的委托方法。另外常用的就是內存不足的系統警告,此時會調用應用程序委托類的applicationDidReceiveMemoryWarning()方法,然后我們就可以試著釋放一些內存了。
上面就是應用程序生命周期(啟動,中止,恢復,退出等過程)的應用程序處理。
小結:iPhone應用程序生命周期講解的內容介紹完了,希望本文對你有所幫助!