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在建立應用程序時,會默認實現一個應用程序 委託類。而對於加載的視圖,則有視圖相關的委託類來處理視圖加載過程的生命事件。下面說明委託(UIApplicationDelegate)主要的一些方法: app
如今來看協議中定義的這些須要實現的方法分別是什麼做用:
一、- (void)applicationWillResignActive:(UIApplication *)application
說明:當應用程序將要入非活動狀態執行,在此期間,應用程序不接收消息或事件,好比來電話了
二、- (void)applicationDidBecomeActive:(UIApplication *)application
說明:當應用程序入活動狀態執行,這個恰好跟上面那個方法相反
三、- (void)applicationDidEnterBackground:(UIApplication *)application
說明:當程序被推送到後臺的時候調用。因此要設置後臺繼續運行,則在這個函數裏面設置便可
四、- (void)applicationWillEnterForeground:(UIApplication *)application
說明:當程序從後臺將要從新回到前臺時候調用,這個恰好跟上面的那個方法相反。
五、- (void)applicationWillTerminate:(UIApplication *)application
說明:當程序將要退出是被調用,一般是用來保存數據和一些退出前的清理工做。這個須要要設置UIApplicationExitsOnSuspend的鍵值。
六、- (void)applicationDidReceiveMemoryWarning:(UIApplication *)application
說明:iPhone設備只有有限的內存,若是爲應用程序分配了太多內存操做系統會終止應用程序的運行,在終止前會執行這個方法,一般能夠在這裏進行內存清理工做防止程序被終止
七、- (void)applicationSignificantTimeChange:(UIApplication*)application
說明:當系統時間發生改變時執行
八、- (void)applicationDidFinishLaunching:(UIApplication*)application
說明:當程序載入後執行
九、- (void)application:(UIApplication)application willChangeStatusBarFrame:(CGRect)newStatusBarFrame
說明:當StatusBar框將要變化時執行
十、- (void)application:(UIApplication*)application willChangeStatusBarOrientation:
(UIInterfaceOrientation)newStatusBarOrientation
duration:(NSTimeInterval)duration
說明:當StatusBar框方向將要變化時執行
十一、- (BOOL)application:(UIApplication*)application handleOpenURL:(NSURL*)url
說明:當經過url執行
十二、- (void)application:(UIApplication*)application didChangeStatusBarOrientation:(UIInterfaceOrientation)oldStatusBarOrientation
說明:當StatusBar框方向變化完成後執行
1三、- (void)application:(UIApplication*)application didChangeSetStatusBarFrame:(CGRect)oldStatusBarFrame
說明:當StatusBar框變化完成後執行 函數
能夠看到UIApplication的頭文件實現
@interface UIApplication :UIResponder <UIActionSheetDelegate>{
@package
id<UIApplicationDelegate> _delegate ; //這就是應用程序委託。
NSTimer .......
}
所以,在UIApplication中處理的系統事件時,只需轉到_delegate這個類去處理, 這個類對象就是應用程序委託對象。咱們能夠從應用程序的單例類對象中獲得應用程序委託的對象
UIApplicationDelegate* myDelegate = [[UIApplication sharedApplication] delegate];
UIApplication 接收到全部的系統事件和生命週期事件時,都會把事件傳遞給UIApplicationDelegate進行處理,對於用戶輸入 事件,則傳遞給相應的目標對象去處理。好比咱們在應用程序被來電等消息後,能夠調用應用程序委託類的 applicationWillResignActive()方法,這個方法在用戶鎖住屏幕時,也會調用,與之相適應的是應用程序從新被用戶打開時的委託 方法。另外經常使用的就是內存不足的系統警告,此時會調用應用程序委託類的applicationDidReceiveMemoryWarning()方法, 而後咱們就能夠試着釋放一些內存了。
上面就是應用程序生命週期(啓動,停止,恢復,退出等過程)的應用程序處理 oop
iPhone中的應用程序很容易受到打擾,好比一個來電可能致使應用程序失去焦點,若是這個時候接聽了電話,那麼應用程序會轉到後臺運行。還有不少其它相似的事件會致使iPhone應用程序失去焦點,在應用程序失去焦點前會調用委託類的applicationWillResignActive()方法,而應用程序再次獲取到焦點的時候會調用applicationDidBecomeActive()方法。好比在運行應用程序的時候鎖屏會調用委託類的applicationWillResignActive()方法,而當屏幕被解鎖的時候,又會調用applicationDidBecomeActive()方法。 google
另一個很是重要的方法就是applicationDidReceiveMemoryWarning(),由於iPhone設備只有有限的內存,若是爲應用程序分配了太多內存操做系統會終止應用程序的運行,但在終止以前操做系統會經過先調用委託類的applicationDidReceiveMemoryWarning()方法警告應用程序,在UIApplication接收到這個事件後它會傳遞給委託類的applicationDidReceiveMemoryWarning()方法,委託類在這個方法內能夠進行釋放內存的操做以防止操做系統強制終止應用程序的運行。 url
下面是這個類的一些功能: spa
//設置主界面icon上的數字圖標,在2.0中引進, 缺省爲0 操作系統
[UIApplicationsharedApplication].applicationIconBadgeNumber = 4; .net
//搖動手勢,是否支持redo undo操做。 code
//3.0之後引進,缺省YES orm
[UIApplicationsharedApplication].applicationSupportsShakeToEdit =YES;
//判斷程序運行狀態,在2.0之後引入
/*
UIApplicationStateActive,
UIApplicationStateInactive,
UIApplicationStateBackground
*/
if([UIApplicationsharedApplication].applicationState ==UIApplicationStateInactive){
NSLog(@"程序在運行狀態");
}
//阻止屏幕變暗,慎重使用,缺省爲no 2.0
[UIApplicationsharedApplication].idleTimerDisabled =YES;
慎重使用本功能,由於很是耗電。
//顯示聯網標記 2.0
[UIApplicationsharedApplication].networkActivityIndicatorVisible =YES;
NSString* addressText =@"1 Infinite Loop, Cupertino, CA 95014";
// URL encode the spaces
addressText = [addressTextstringByAddingPercentEscapesUsingEncoding:NSASCIIStringEncoding];
NSString* urlText = [NSStringstringWithFormat:@"http://maps.google.com/maps?q=%@", addressText];
[[UIApplicationsharedApplication]openURL:[NSURLURLWithString:urlText]];
NSString *recipients =@"mailto:first@example.com?cc=second@example.com,third@example.com&subject=Hello from California!";
NSString *body =@"&body=It is raining in sunny California!";
NSString *email = [NSStringstringWithFormat:@"%@%@", recipients, body];
email = [emailstringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
[[UIApplicationsharedApplication]openURL:[NSURLURLWithString:email]];
// Call Google 411
[[UIApplicationsharedApplication]openURL:[NSURLURLWithString:@"tel://8004664411"]];
// Text to Google SMS
[[UIApplicationsharedApplication]openURL:[NSURLURLWithString:@"sms://466453"]];
// Lanuch any iPhone developers fav site
[[UIApplicationsharedApplication]openURL:[NSURLURLWithString:@"http://itunesconnect.apple.com"]];