UIApplication、AppDelegate、委託等的關係? 什麼是委託?爲何要有委託?委託在Iphone中的實現機制是怎樣的? 通常來講,咱們建立了一個Iphone項目,默認會有這個main.m類,咱們都曉得,一個main()方法表明着一個應用程序的入口, 如下是對應的main.m的方法體: int main(int argc, char *argv[]) { @autoreleasepool { return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); } } 在上述的這個方法體中,UIApplicationMain()方法根據咱們提供的AppDelegate類名稱來建立UIApplication的一個實例,且將這個 AppDelegate做爲UIApplication的委託,通常咱們能夠經過類方法[UIApplication shareApplication]來獲取對UIApplication 的一個引用; 在UIApplication接收到系統事件和生命週期事件時,會把相應的事件傳遞給UIApplicationDelegate進行處理,下表所列的生命週期函數大都是可選的, 但爲了應用程序的健壯性程序員應該實現它們。 一、- (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框變化完成後執行 iPhone中的應用程序很容易受到打擾,好比一個來電可能致使應用程序失去焦點,若是這個時候接聽了電話,那麼應用程序會轉到後臺運行。 還有不少其它相似的事件會致使iPhone應用程序失去焦點,在應用程序失去焦點前會調用委託類的applicationWillResignActive()方法, 而應用程序再次獲取到焦點的時候會調用applicationDidBecomeActive()方法。 好比在運行應用程序的時候鎖屏會調用委託類的applicationWillResignActive()方法,而當屏幕被解鎖的時候,又會調用applicationDidBecomeActive()方法。 另一個很是重要的方法就是applicationDidReceiveMemoryWarning(),由於iPhone設備只有有限的內存,若是爲應用程序分配了太多內存操做系統會終止應用程序的運行,但在終止以前操做系統會經過先調用委託類的applicationDidReceiveMemoryWarning()方法警告應用程序,在UIApplication接收到這個事件後它會傳遞給委託類的applicationDidReceiveMemoryWarning()方法,委託類在這個方法內能夠進行釋放內存的操做以防止操做系統強制終止應用程序的運行。 下面是這個類的一些功能: 1.設置icon上的數字圖標 //設置主界面icon上的數字圖標,在2.0中引進, 缺省爲0 [UIApplication sharedApplication].applicationIconBadgeNumber = 4; 2.設置搖動手勢的時候,是否支持redo,undo操做 //搖動手勢,是否支持redo undo操做。 //3.0之後引進,缺省YES [UIApplication sharedApplication].applicationSupportsShakeToEdit =YES; 3.判斷程序運行狀態 //判斷程序運行狀態,在2.0之後引入 /* UIApplicationStateActive, UIApplicationStateInactive, UIApplicationStateBackground */ if([UIApplication sharedApplication].applicationState ==UIApplicationStateInactive){ NSLog(@"程序在運行狀態"); } 4.阻止屏幕變暗進入休眠狀態 //阻止屏幕變暗,慎重使用,缺省爲no 2.0 [UIApplicationsharedApplication].idleTimerDisabled =YES; 慎重使用本功能,由於很是耗電。 5.顯示聯網狀態 //顯示聯網標記 2.0 [UIApplication sharedApplication].networkActivityIndicatorVisible =YES; 6.在map上顯示一個地址 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]; [[UIApplication sharedApplication]openURL:[NSURLURLWithString:urlText]]; 7.發送電子郵件 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]; [[UIApplication sharedApplication]openURL:[NSURLURLWithString:email]]; 8.打電話到一個號碼 // Call Google 411 [[UIApplication sharedApplication]openURL:[NSURLURLWithString:@"tel://8004664411"]]; 9.發送短信 // Text to Google SMS [[UIApplication sharedApplication]openURL:[NSURLURLWithString:@"sms://466453"]]; 10.打開一個網址 // Lanuch any iPhone developers fav site [[UIApplication sharedApplication]openURL:[NSURLURLWithString:@"http://itunesconnect.apple.com"]]; UIApplication:通常是指運行中的應用程序,它的一個主要工做是處理用戶事件,它會引發一個隊列,全部的用戶事件都放入到隊列中, 逐個被處理掉,在處理的時候,它會發送事件到一個合適的處理事件的目標控件,此外,UIApplication還維護在本應用程序中打開的 Window列表(UIWindow實例),這樣子它就能夠接觸應用程序中的任何一個UIView對象; AppDelegate:負責爲另一個對象處理特定事件的類,好比咱們load完一個頁面的時候,委託就幫助UIApplication完成 didFinishLaunchingWithOptions動做,相應地在這個方法裏面執行對應地action; 委託是給一個對象提供機會對另外一個對象中的變化做出反映或者影響另外一個對象的行爲,一般包括3種動詞:should、will、did UIApplication委託AppDelegate,則AppDelegate必須得實現UIApplicationDelegate協議,這個協議咱們能夠當成是java中的一個接口, 協議中定義了一系列方法,咱們必須在子類中將其實現,而後底層UIApplication會自動去調用咱們已經定義好的方法,這有點相似java中Ioc方向控制機制 固然,iphone中運用委託設計模式的地方不少,好比這個UIActionSheetDelegate、UIAlertViewDelegate協議,好比咱們要在本身的某個界面中展現 這個操做表(UIActionSheet),則咱們的視圖控制器必需要實現這個UIActionSheetDelegate協議,重寫其中的某些方法,也就是說,誰被委託了, 誰就要實現協議中定義的方法,確保正常的調用