免费色播,亚洲国产欧美国产第一区二区三区,毛片看,日本精品在线观看视频,国产成人精品一区二区免费视频,日本黄色免费网站,一级毛片免费

深入理解iPhone委托模式兼談iPhone生命周期

來源:網(wǎng)絡(luò)

點擊:1089

A+ A-

所屬頻道:新聞中心

關(guān)鍵詞: iPhone,委托模式,生命周期

      每個iPhone應(yīng)用程序都有一個UIApplication,UIApplication是iPhone應(yīng)用程序的開始并且負(fù)責(zé)初始化并顯示UIWindow,并負(fù)責(zé)加載應(yīng)用程序的第一個UIView到UIWindow窗體中。UIApplication的另一個任務(wù)是幫助管理應(yīng)用程序的生命周期,而UIApplication通過一個名字為UIApplicationDelegate的代理類來履行這個任務(wù)。盡管UIApplication會負(fù)責(zé)接收事件,而UIApplicationDelegate則決定應(yīng)用程序如何去響應(yīng)這些事件,UIApplicationDelegate可以處理的事件包括應(yīng)用程序的生命周期事件(比如程序啟動和關(guān)閉)、系統(tǒng)事件(比如來電、記事項警告),本文會介紹如何加載應(yīng)用程序的UIView到UIWindow以及如何利用UIApplicationDelegate處理系統(tǒng)事件。

      通常對于UIApplication讀者是沒必要修改它的,只需要知道UIApplication接收系統(tǒng)事件即可,而如何編寫代碼來處理這些系統(tǒng)事件則是程序員的工作。處理系統(tǒng)事件需要編寫一個繼承自UIApplicationDelegate接口的類,而UIApplicationDelegate接口提供生命周期函數(shù)來處理應(yīng)用程序以及應(yīng)用程序的系統(tǒng)事件,這些生命周期函數(shù)如下表所示:

      

    UIApplicationDelegate Event-Handling Methods

    Method Signature

    1:application:didChangeStatusBarFrame:

    - (void)application:(UIApplication*)application didChangeSetStatusBarFrame:(CGRect)oldStatusBarFrame

    2:application:didChangeStatusBarOrientation:

    - (void)application:(UIApplication*)application didChangeStatusBarOrientation:(UIInterfaceOrientation)oldStatusBarOrientation

    3:application:handleOpenURL:

    - (BOOL)application:(UIApplication*)application handleOpenURL:(NSURL*)url

    4:application:willChangeStatusBarOrientation:duration:

    - (void)application:(UIApplication*)application willChangeStatusBarOrientation:

    (UIInterfaceOrientation)newStatusBarOrientation
               duration:(NSTimeInterval)duration

    5:application:willChangeStatusBarFrame

    - (void)application:(UIApplication)application willChangeStatusBarFrame:(CGRect)newStatusBarFrame

    6:applicationDidBecomeActive:

    - (void)applicationDidBecomeActive:(UIApplication*)application

    7:applicationDidFinishLaunching:

    - (void)applicationDidFinishLaunching:(UIApplication*)application

    8:applicationDidReceiveMemoryWarning:

    - (void)applicationDidReceiveMemoryWarning:(UIApplication*)application

    9:applicationSignificantTimeChange:

    - (void)applicationSignificantTimeChange:(UIApplication*)application

    10:applicationWillResignActive:

    - (void)applicationWillResignActive:(UIApplication*)application

    11:applicationWillTerminate:

    - (void)applicationWillTerminate:(UIApplication*)application

     

    表1

      如果利用Xcode的模板創(chuàng)建項目,Xcode會為程序員創(chuàng)建繼承自UIApplicationDelegate的類,但不會自動實現(xiàn)繼承自UIApplicationDelegate的可選的事件處理函數(shù)。如果讀者創(chuàng)建一個名為“TestUIApplication”的項目,Xcode會自動創(chuàng)建TestUIApplicationAppDelegate.h和TestUIApplicationAppDelegate.m文件,文件的聲明如下:

      @interface TestUIApplicationAppDelegate : NSObject 《UIApplicationDelegate》

      而應(yīng)用程序的UIApplication則被定義在MainWindow.xib文件中,并且有一個作為outlet的UIApplicationDelegate引用,如下圖:

      

      圖1

      當(dāng)應(yīng)用程序接收到表1中的事件時,UIApplication會調(diào)用UIApplicationDelegate中實現(xiàn)的相應(yīng)的方法。

      從根本上講,委托(delegate)是iPhone中廣泛采用的一種編程方法,這種方法有很多益處:

      它更為簡潔的把程序的邏輯處理從UIApplication中分離了出來。

      它避免了程序員直接從UIApplication派生子類,試想如果通過從UIApplication派生子類的方法來管理應(yīng)用程序的生命周期和系統(tǒng)事件是多么痛苦的一件事情。

      同樣,“委托模式”也是一種常用的面向?qū)ο蟮脑O(shè)計模式,這種設(shè)計模式用Java語言可以更好的進(jìn)行描述。

      “委托模式”中一般有兩個對象參與處理同一個請求,所謂的請求在iPhone中就是應(yīng)用程序的生命周期和系統(tǒng)事件,接受請求的對象將請求委托給另一個對象來處理,同樣在iPhone中對應(yīng)的是UIApplication在接收到生命周期和系統(tǒng)事件后委托給UIApplicationDelegate來處理。同樣,委托模式也是很多其它模式的基礎(chǔ),如狀態(tài)模式、策略模式、訪問者模式本質(zhì)上是在特殊的情況下采用了委托模式。委托模式使得可以用聚合代理繼承,正如iPhone中為了避免直接從UIApplication繼承而采用委托模式一樣。

      如果用Java來模擬iPhone中委托模式的處理過程,UIApplication定義大致如下:

      public class UIApplication {

      public final int UP = 1;

      public final int DOWN = 2;

      public final int DRAG = 3;

      public final int DROP = 4;

      private UIApplicationDelegate Delegate;

      /**

      * @param args

      */

      public UIApplication(UIApplicationDelegate aDelegate)

      {}

      public boolean HandlerSysEvents(int aEventValue)

      {

      switch(aEventValue)

      {

      case UP:

      Delegate.HanlderEvents(aEventValue);

      break;

      case DOWN:

      Delegate.HanlderEvents(aEventValue);

      break;

      case DRAG:

      Delegate.HanlderEvents(aEventValue);

      break;

      case DROP:

      Delegate.HanlderEvents(aEventValue);

      break;

      }

      return false;

      }

      }

      而委托接口UIApplicationDelegate的定義如下:

      public interface UIApplicationDelegate {

      public void applicationDidFinishLaunching(UIApplication application);

      public boolean HanlderEvents(int aEventsValue);

      }

      可見,通過傳遞UIApplicationDelegate到UIApplication中,系統(tǒng)就可以在UIApplication接收到系統(tǒng)事件時調(diào)用委托類UIApplicationDelegate中相應(yīng)的方法來處理系統(tǒng)事件。

      探究iPhone不采用繼承體系而采用委托模式來實現(xiàn)聚合的原因,其更深層次在于iPhone框架的多樣化使得繼承無法保證子類行為的一致性,而委托模式恰恰是為了彌補繼承的這個缺點誕生的。

      打開Other Sources目錄下main.m文件,可以看到如下代碼:

      #import 《UIKit/UIKit.h》

      int main(int argc, char *argv[]) {

      NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

      int retVal = UIApplicationMain(argc, argv, nil, nil);

      [pool release];

      return retVal;

      }

      每個項目都會有一個UIApplication對象來處理應(yīng)用程序的生命周期和系統(tǒng)事件,main()函數(shù)通過UIApplicationMain()來初始化應(yīng)用程序的UIApplication,如果讀者想對應(yīng)用程序的UIApplication進(jìn)行操作,就只能通過[UIApplication sharedApplication]來獲取到UIApplication的引用,這個方法會返回一個全局唯一的UIApplication對象給讀者。

      同樣,讀者可以通過如下代碼獲取應(yīng)用程序的委托對象:

      UIApplicationDelegate* myDelegate = [[UIApplication sharedApplication] delegate];

      在UIApplication接收到系統(tǒng)事件和生命周期事件時,會把相應(yīng)的事件傳遞給UIApplicationDelegate進(jìn)行處理,表1所列的生命周期函數(shù)大都是可選的,但為了應(yīng)用程序的健壯性程序員應(yīng)該實現(xiàn)它們。

      iPhone并不是多任務(wù)的操作系統(tǒng),所以應(yīng)用程序很容易受到打擾,比如一個來電可能導(dǎo)致應(yīng)用程序失去焦點,如果這個時候接聽了電話,那么應(yīng)用程序會自動終止運行。還有很多其它類似的事件會導(dǎo)致iPhone應(yīng)用程序失去焦點,在應(yīng)用程序失去焦點前會調(diào)用委托類的applicationWillResignActive()方法,而應(yīng)用程序再次獲取到焦點的時候會調(diào)用applicationDidBecomeActive()方法。比如在運行應(yīng)用程序的時候鎖屏?xí){(diào)用委托類的applicationWillResignActive()方法,而當(dāng)屏幕被解鎖的時候,又會調(diào)用applicationDidBecomeActive()方法。

      另外一個非常重要的方法就是applicationDidReceiveMemoryWarning(),因為iPhone設(shè)備只有有限的內(nèi)存,如果為應(yīng)用程序分配了太多內(nèi)存操作系統(tǒng)會終止應(yīng)用程序的運行,但在終止之前操作系統(tǒng)會通過先調(diào)用委托類的applicationDidReceiveMemoryWarning()方法警告應(yīng)用程序,在UIApplication接收到這個事件后它會傳遞給委托類的applicationDidReceiveMemoryWarning()方法,委托類在這個方法內(nèi)可以進(jìn)行釋放內(nèi)存的操作以防止操作系統(tǒng)強制終止應(yīng)用程序的運行。

    (審核編輯: 智匯小新)

    聲明:除特別說明之外,新聞內(nèi)容及圖片均來自網(wǎng)絡(luò)及各大主流媒體。版權(quán)歸原作者所有。如認(rèn)為內(nèi)容侵權(quán),請聯(lián)系我們刪除。