《電子技術應用》
您所在的位置:首頁 > 顯示光電 > 設計應用 > 深入理解iPhone委托模式兼談iPhone生命周期
深入理解iPhone委托模式兼談iPhone生命周期
摘要: 每個iPhone應用程序都有一個UIApplication,UIApplication是iPhone應用程序的開始并且負責初始化并顯示UIWindow,并負責加載應用程序的第一個UIView到UIWindow窗體中。
Abstract:
Key words :

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

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

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的模板創建項目,Xcode會為程序員創建繼承自UIApplicationDelegate的類,但不會自動實現繼承自UIApplicationDelegate的可選的事件處理函數。如果讀者創建一個名為“TestUIApplication”的項目,Xcode會自動創建TestUIApplicationAppDelegate.h和TestUIApplicationAppDelegate.m文件,文件的聲明如下:

  @interface TestUIApplicationAppDelegate : NSObject 《UIApplicationDelegate》

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

  

  圖1

  當應用程序接收到表1中的事件時,UIApplication會調用UIApplicationDelegate中實現的相應的方法。

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

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

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

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

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

  

 

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的模板創建項目,Xcode會為程序員創建繼承自UIApplicationDelegate的類,但不會自動實現繼承自UIApplicationDelegate的可選的事件處理函數。如果讀者創建一個名為“TestUIApplication”的項目,Xcode會自動創建TestUIApplicationAppDelegate.h和TestUIApplicationAppDelegate.m文件,文件的聲明如下:

  @interface TestUIApplicationAppDelegate : NSObject 《UIApplicationDelegate》

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

  

  圖1

  當應用程序接收到表1中的事件時,UIApplication會調用UIApplicationDelegate中實現的相應的方法。

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

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

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

  同樣,“委托模式”也是一種常用的面向對象的設計模式,這種設計模式用Java語言可以更好的進行描述。

  “委托模式”中一般有兩個對象參與處理同一個請求,所謂的請求在iPhone中就是應用程序的生命周期和系統事件,接受請求的對象將請求委托給另一個對象來處理,同樣在iPhone中對應的是UIApplication在接收到生命周期和系統事件后委托給UIApplicationDelegate來處理。同樣,委托模式也是很多其它模式的基礎,如狀態模式、策略模式、訪問者模式本質上是在特殊的情況下采用了委托模式。委托模式使得可以用聚合代理繼承,正如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中,系統就可以在UIApplication接收到系統事件時調用委托類UIApplicationDelegate中相應的方法來處理系統事件。

  探究iPhone不采用繼承體系而采用委托模式來實現聚合的原因,其更深層次在于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對象來處理應用程序的生命周期和系統事件,main()函數通過UIApplicationMain()來初始化應用程序的UIApplication,如果讀者想對應用程序的UIApplication進行操作,就只能通過[UIApplication sharedApplication]來獲取到UIApplication的引用,這個方法會返回一個全局唯一的UIApplication對象給讀者。

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

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

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

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

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

此內容為AET網站原創,未經授權禁止轉載。
亚洲一区二区欧美_亚洲丝袜一区_99re亚洲国产精品_日韩亚洲一区二区
免费成人在线视频网站| 国产精品每日更新在线播放网址| 夜久久久久久| 亚洲国产日韩欧美在线图片| 午夜精品久久久久久久蜜桃app| 一本色道88久久加勒比精品 | 欧美欧美午夜aⅴ在线观看| 久久一区二区三区av| 久久精品青青大伊人av| 欧美亚洲日本网站| 午夜精品久久久久久久99热浪潮 | 鲁大师成人一区二区三区| 久久久久国产成人精品亚洲午夜| 午夜视频一区二区| 性欧美videos另类喷潮| 午夜精品久久久久久久99热浪潮 | 午夜日韩视频| 午夜免费久久久久| 午夜精彩视频在线观看不卡 | 久久久久久久一区二区三区| 久久久久一本一区二区青青蜜月| 久久精视频免费在线久久完整在线看| 久久成人在线| 欧美一区二区三区视频免费播放| 欧美在线综合| 久久影视精品| 欧美顶级艳妇交换群宴| 欧美黄色aaaa| 欧美日本亚洲视频| 欧美视频在线观看 亚洲欧| 国产精品第三页| 国产日韩在线看| 精久久久久久| 亚洲精品少妇30p| 中文精品在线| 性一交一乱一区二区洋洋av| 久久精品日韩| 日韩视频在线一区二区| 亚洲一区二区三区四区视频| 午夜性色一区二区三区免费视频 | 国产亚洲va综合人人澡精品| 韩日成人av| 亚洲精品韩国| 亚洲欧美日韩成人| 久久国产精品一区二区| 亚洲免费观看视频| 性欧美激情精品| 久久综合色影院| 欧美婷婷六月丁香综合色| 国产日韩欧美另类| 亚洲国产成人久久综合| 一本大道久久a久久综合婷婷| 亚洲综合另类| 亚洲精品日本| 香蕉久久精品日日躁夜夜躁| 久久久人成影片一区二区三区观看| 欧美大片在线观看| 国产精品久久久久毛片大屁完整版| 国精品一区二区三区| 日韩图片一区| 欧美综合国产精品久久丁香| 制服丝袜亚洲播放| 久久―日本道色综合久久| 欧美日韩国产综合新一区| 国产一区二区三区四区五区美女| 亚洲激情在线| 欧美一区二区视频观看视频| 夜夜嗨av色综合久久久综合网| 欧美一区视频| 欧美日韩精品一区视频 | 欧美一区二区三区喷汁尤物| 99精品视频免费在线观看| 久久精品水蜜桃av综合天堂| 欧美美女喷水视频| 国产一区深夜福利| 这里只有精品视频| 亚洲经典在线看| 久久xxxx| 欧美视频在线看| 在线观看日韩一区| 午夜在线成人av| 亚洲一区精品电影| 欧美韩国在线| 国内精品久久久久久影视8| 亚洲视频一区在线观看| 亚洲日韩欧美一区二区在线| 久久精品国产欧美激情| 欧美亚洲成人网| 亚洲激情自拍| 亚洲国产欧美日韩另类综合| 欧美主播一区二区三区| 国产精品第2页| 亚洲精品在线视频观看| 亚洲国产天堂久久综合网| 销魂美女一区二区三区视频在线| 欧美日韩精品福利| 亚洲国产高清在线| 亚洲电影天堂av| 久久精品成人| 国产美女一区| 一区二区三区黄色| 一区二区三区国产在线观看| 免费在线观看一区二区| 国产一区久久久| 欧美一区二区三区的| 欧美一级理论片| 国产麻豆午夜三级精品| 亚洲网站啪啪| 亚洲一区二区在线免费观看| 欧美日产国产成人免费图片| 亚洲国产欧美一区二区三区同亚洲| 亚洲黄页视频免费观看| 久久久水蜜桃av免费网站| 国产午夜精品一区理论片飘花| 亚洲自拍偷拍一区| 先锋a资源在线看亚洲| 欧美色欧美亚洲高清在线视频| 亚洲裸体俱乐部裸体舞表演av| 亚洲伦理在线观看| 欧美激情a∨在线视频播放| 精品成人a区在线观看| 欧美在线亚洲一区| 久久蜜臀精品av| 一区二区三区在线看| 亚洲国产精品女人久久久| 麻豆国产va免费精品高清在线| 国内免费精品永久在线视频| 久久精品国产第一区二区三区| 久久久噜噜噜久久久| 狠狠色2019综合网| 亚洲国产一成人久久精品| 免费在线国产精品| 亚洲欧洲日产国产网站| 一卡二卡3卡四卡高清精品视频 | 欧美日韩伦理在线免费| av成人手机在线| 亚洲欧美中日韩| 国产亚洲精久久久久久| 欧美呦呦网站| 欧美凹凸一区二区三区视频| 亚洲人在线视频| 亚洲图片欧美日产| 国产精品系列在线播放| 欧美在线综合| 免费成人av| 日韩视频在线一区| 香蕉亚洲视频| 极品尤物一区二区三区| 91久久精品一区| 欧美日韩小视频| 香蕉久久夜色精品国产| 久久综合综合久久综合| 亚洲精品国精品久久99热| 亚洲欧美成人精品| 国语自产精品视频在线看一大j8| 91久久夜色精品国产网站| 欧美日韩精品伦理作品在线免费观看| 亚洲午夜一级| 久久久国产一区二区| 亚洲国产日韩美| 亚洲在线网站| 国产综合色一区二区三区| 亚洲精品日韩一| 国产精品国产a级| 亚洲第一在线视频| 欧美理论视频| 亚洲欧美清纯在线制服| 免费看成人av| 夜夜夜久久久| 另类图片国产| 亚洲午夜精品一区二区| 久久综合久色欧美综合狠狠| 99热这里只有成人精品国产| 久久国产视频网| 亚洲人成在线免费观看| 午夜亚洲福利在线老司机| 永久免费视频成人| 亚洲欧美日韩一区二区在线| 激情成人综合网| 亚洲自拍偷拍福利| 亚洲第一页在线| 欧美一级在线视频| 亚洲激情电影在线| 欧美在线视频一区二区| 亚洲精美视频| 久久久久se| 中文有码久久| 欧美国产综合| 欧美一区激情| 国产精品久久久久久久久借妻 | 夜夜嗨av一区二区三区网站四季av | 亚洲欧美综合网| 亚洲国产一区二区精品专区| 久久国产视频网| aa亚洲婷婷| 欧美大尺度在线| 久久国产精品99精品国产| 国产精品美女黄网| 亚洲日韩中文字幕在线播放| 国产日产欧产精品推荐色|