《電子技術(shù)應(yīng)用》
您所在的位置:首頁 > 顯示光電 > 設(shè)計(jì)應(yīng)用 > 深入理解iPhone委托模式兼談iPhone生命周期
深入理解iPhone委托模式兼談iPhone生命周期
摘要: 每個(gè)iPhone應(yīng)用程序都有一個(gè)UIApplication,UIApplication是iPhone應(yīng)用程序的開始并且負(fù)責(zé)初始化并顯示UIWindow,并負(fù)責(zé)加載應(yīng)用程序的第一個(gè)UIView到UIWindow窗體中。
關(guān)鍵詞: iPhone 委托模式 生命周期
Abstract:
Key words :

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

  通常對(duì)于UIApplication讀者是沒必要修改它的,只需要知道UIApplication接收系統(tǒng)事件即可,而如何編寫代碼來處理這些系統(tǒng)事件則是程序員的工作。處理系統(tǒng)事件需要編寫一個(gè)繼承自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)建項(xiàng)目,Xcode會(huì)為程序員創(chuàng)建繼承自UIApplicationDelegate的類,但不會(huì)自動(dòng)實(shí)現(xiàn)繼承自UIApplicationDelegate的可選的事件處理函數(shù)。如果讀者創(chuàng)建一個(gè)名為“TestUIApplication”的項(xiàng)目,Xcode會(huì)自動(dòng)創(chuàng)建TestUIApplicationAppDelegate.h和TestUIApplicationAppDelegate.m文件,文件的聲明如下:

  @interface TestUIApplicationAppDelegate : NSObject 《UIApplicationDelegate》

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

  

  圖1

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

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

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

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

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

  通常對(duì)于UIApplication讀者是沒必要修改它的,只需要知道UIApplication接收系統(tǒng)事件即可,而如何編寫代碼來處理這些系統(tǒng)事件則是程序員的工作。處理系統(tǒng)事件需要編寫一個(gè)繼承自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)建項(xiàng)目,Xcode會(huì)為程序員創(chuàng)建繼承自UIApplicationDelegate的類,但不會(huì)自動(dòng)實(shí)現(xiàn)繼承自UIApplicationDelegate的可選的事件處理函數(shù)。如果讀者創(chuàng)建一個(gè)名為“TestUIApplication”的項(xiàng)目,Xcode會(huì)自動(dòng)創(chuàng)建TestUIApplicationAppDelegate.h和TestUIApplicationAppDelegate.m文件,文件的聲明如下:

  @interface TestUIApplicationAppDelegate : NSObject 《UIApplicationDelegate》

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

  

  圖1

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

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

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

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

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

  “委托模式”中一般有兩個(gè)對(duì)象參與處理同一個(gè)請(qǐng)求,所謂的請(qǐng)求在iPhone中就是應(yīng)用程序的生命周期和系統(tǒng)事件,接受請(qǐng)求的對(duì)象將請(qǐng)求委托給另一個(gè)對(duì)象來處理,同樣在iPhone中對(duì)應(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)事件時(shí)調(diào)用委托類UIApplicationDelegate中相應(yīng)的方法來處理系統(tǒng)事件。

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

  打開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;

  }

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

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

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

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

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

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

此內(nèi)容為AET網(wǎng)站原創(chuàng),未經(jīng)授權(quán)禁止轉(zhuǎn)載。
亚洲一区二区欧美_亚洲丝袜一区_99re亚洲国产精品_日韩亚洲一区二区
亚洲日本va午夜在线电影| 亚洲在线电影| 国产精品户外野外| 欧美日韩成人一区二区三区| 久久亚洲欧美国产精品乐播| 久久国产精品一区二区三区| 亚洲欧美国产不卡| 亚洲在线播放| 亚洲午夜精品一区二区| 一区二区激情小说| 中日韩午夜理伦电影免费| 日韩一级片网址| 亚洲免费大片| 亚洲最新色图| 亚洲视频你懂的| 亚洲图片在线| 亚洲自拍16p| 亚洲一区二区欧美日韩| 一区二区福利| 亚洲一区一卡| 亚洲一区二区三区四区在线观看| 亚洲一区二区在线免费观看视频| 亚洲一二三区在线观看| 亚洲男人的天堂在线aⅴ视频| 亚洲影院免费| 午夜在线精品| 久久久久.com| 欧美~级网站不卡| 欧美成人精品在线| 欧美顶级艳妇交换群宴| 欧美日本国产一区| 国产精品igao视频网网址不卡日韩| 欧美午夜精品久久久久久孕妇| 国产精品福利在线| 国产欧美日本一区二区三区| 国产一区二区欧美| 在线观看日韩一区| 亚洲精选在线观看| 亚洲一区二区三区乱码aⅴ蜜桃女| 午夜精品久久久久久久白皮肤| 欧美在线二区| 亚洲日本一区二区| 中日韩美女免费视频网址在线观看 | 亚洲欧洲综合另类| 亚洲免费观看在线视频| 亚洲永久免费视频| 久久久久久久国产| 欧美国产精品人人做人人爱| 国产精品99免视看9| 国产有码一区二区| 亚洲精品国精品久久99热| 亚洲制服少妇| 亚洲国产一区在线观看| 亚洲一区二区三区中文字幕在线| 久久国产视频网| 欧美成人自拍| 国产精品免费电影| 在线免费精品视频| 这里只有视频精品| 欧美在线一二三区| 一区二区日韩精品| 久久精品一区二区三区不卡牛牛| 欧美精品国产精品| 国产伦一区二区三区色一情| 亚洲高清不卡av| 亚洲综合国产激情另类一区| 亚洲国产欧美国产综合一区| 亚洲女人小视频在线观看| 久久视频这里只有精品| 国产精品国产a| 在线看不卡av| 亚洲欧美日韩在线综合| 亚洲理伦在线| 久久精品国产99国产精品| 欧美伦理91| 国模精品娜娜一二三区| aa亚洲婷婷| 亚洲人成在线观看一区二区| 性欧美大战久久久久久久免费观看| 欧美91福利在线观看| 国产精品综合视频| 一区二区三区免费看| 亚洲精品国产拍免费91在线| 午夜精品久久久久久久蜜桃app| 欧美成人a∨高清免费观看| 国产精品一区在线观看| aa级大片欧美三级| 亚洲精品女人| 久久久久久综合网天天| 国产精品手机视频| 野花国产精品入口| 亚洲免费电影在线| 欧美+亚洲+精品+三区| 国产香蕉97碰碰久久人人| 国产精品99久久久久久久久| 亚洲精品日韩激情在线电影| 久久久最新网址| 国产欧美日韩91| 亚洲综合999| 亚洲综合色网站| 欧美三区在线视频| 亚洲精品国产精品国自产在线 | 欧美精品在线免费| 精品成人一区二区| 欧美亚洲视频一区二区| 亚洲欧美日韩第一区 | 国产精品美女久久久免费| 亚洲人成7777| 亚洲欧洲在线观看| 欧美成人免费播放| 在线观看欧美日本| 91久久国产综合久久蜜月精品 | 久久婷婷国产综合国色天香| 国产欧美视频一区二区| 亚洲淫性视频| 亚洲欧美精品伊人久久| 欧美视频网址| 一本久久综合| 中文在线不卡| 欧美日韩一区二区视频在线观看 | 欧美—级a级欧美特级ar全黄| 精品不卡一区| 最新国产の精品合集bt伙计| 美女黄色成人网| 亚洲第一区色| 99精品国产高清一区二区| 欧美成人日韩| 亚洲精品乱码| 在线亚洲国产精品网站| 欧美日韩中文字幕综合视频| 在线视频欧美精品| 午夜精品久久| 国产日韩欧美自拍| 久久精品国产免费观看| 另类综合日韩欧美亚洲| 亚洲国产视频直播| 99精品欧美一区二区三区| 欧美日本韩国在线| 一区二区成人精品| 欧美一区二区精品| 国产一区二区三区的电影| 久久国产手机看片| 欧美激情综合色| 一区二区三区日韩欧美精品| 香蕉精品999视频一区二区| 国产日韩欧美一区在线| 亚洲国产精品一区在线观看不卡 | 在线观看三级视频欧美| 99国产精品私拍| 国产精品白丝av嫩草影院| 午夜精品福利一区二区蜜股av| 久久久精品国产免大香伊| 在线免费高清一区二区三区| 一本久久知道综合久久| 国产精品九九| 欧美伊人影院| 欧美经典一区二区| 亚洲网站在线看| 久久免费高清| 亚洲人体影院| 欧美一级理论性理论a| 激情欧美一区二区三区在线观看| 亚洲精品永久免费精品| 国产精品男女猛烈高潮激情| 久久国产成人| 欧美日韩精品不卡| 欧美亚洲综合另类| 欧美激情bt| 亚洲欧美日韩一区二区三区在线观看 | 欧美激情亚洲| 亚洲综合第一| 欧美刺激午夜性久久久久久久| 一区二区三区四区五区精品| 久久精品主播| 夜夜嗨一区二区| 久久人体大胆视频| 99国产一区二区三精品乱码| 久久久精品动漫| 在线亚洲+欧美+日本专区| 久久蜜桃香蕉精品一区二区三区| 亚洲精品免费电影| 久久精品人人做人人综合 | 亚洲黄网站在线观看| 欧美系列亚洲系列| 亚洲第一在线综合网站| 国产精品久久久一区麻豆最新章节 | 伊人精品久久久久7777| 99伊人成综合| 国产一区二区福利| 亚洲一卡二卡三卡四卡五卡| 激情视频一区二区| 午夜一区二区三区在线观看| 亚洲电影在线免费观看| 欧美一区二区三区四区夜夜大片 | 免费视频最近日韩| 性久久久久久| 欧美午夜精品久久久久久超碰| 亚洲日本欧美日韩高观看| 国产亚洲精品福利| 午夜欧美精品久久久久久久|