日韩欧美自拍在线观看-欧美精品在线看片一区二区-高清性视频一区二区播放-欧美日韩女优制服另类-国产精品久久久久久av蜜臀-成人在线黄色av网站-肥臀熟妇一区二区三区-亚洲视频在线播放老色-在线成人激情自拍视频

詳解iPhone委托模式兼談iPhone生命周期

出處:wyf_21 發(fā)布于:2011-08-26 12:18:13

 

  iPhone由蘋果公司(Apple, Inc.)執(zhí)行官史蒂夫·喬布斯在2007年1月9日舉行的Macworld宣布推出,2007年6月29日在美國上市,將創(chuàng)新的移動電話、可觸摸寬屏iPod以及具有桌面級電子郵件、網(wǎng)頁瀏覽、搜索和地圖功能的突破性因特網(wǎng)通信設(shè)備這三種產(chǎn)品完美地融為一體。iPhone引入了基于大型多觸點顯示屏和性新軟件的全新用戶界面,讓用戶用手指即可控制iPhone.iPhone還開創(chuàng)了移動設(shè)備軟件功能的新紀元,重新定義了移動電話的功能?,F(xiàn)在中國大陸iPhone使用率已經(jīng)非常高了,在各個時尚潮人,明星,高層之中普及率更高。它被定義為一種高品味的象征。很多網(wǎng)站,實體店等等有有iPhone配件以及整機出售,為中國的通訊產(chǎn)業(yè)的發(fā)展做出了巨大的貢獻。同時也解決了不少人的就業(yè)問題。iPhone無疑是非常偉大的跨時代產(chǎn)品,甚至有人打出"無所不能的iPhone"這樣的口號。至今仍沒有一款手機可以在用戶體驗上超越iphone!目前在APP store上的軟件已經(jīng)達到幾十萬,累計量超億次。

  每個iPhone應(yīng)用程序都有一個UIApplication,UIApplication是iPhone應(yīng)用程序的開始并且負責(zé)初始化并顯示UIWindow,并負責(zé)加載應(yīng)用程序的個UIView到UIWindow窗體中。UIApplication的另一個任務(wù)是幫助管理應(yīng)用程序的生命周期,而UIApplication通過一個名字為UIApplicationDelegate的代理類來履行這個任務(wù)。盡管UIApplication會負責(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語言可以更好的進行描述。

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

  Java平臺由Java虛擬機(Java Virtual Machine)和Java 應(yīng)用編程接口(Application Programming Interface、簡稱API)構(gòu)成。Java 應(yīng)用編程接口為Java應(yīng)用提供了一個獨立于操作系統(tǒng)的標準接口,可分為基本部分和擴展部分。在硬件或操作系統(tǒng)平臺上安裝一個Java平臺之后,Java應(yīng)用程序就可運行?,F(xiàn)在Java平臺已經(jīng)嵌入了幾乎所有的操作系統(tǒng)。這樣Java程序可以只編譯,就可以在各種系統(tǒng)中運行。Java應(yīng)用編程接口已經(jīng)從1.1x版發(fā)展到1.2版。目前常用的Java平臺基于Java1.5,近版本為Java1.7.Java分為三個體系JavaSE(Java2 Platform Standard Edition,java平臺標準版),JavaEE(Java 2 Platform,Enterprise Edition,java平臺企業(yè)版),JavaME(Java 2 Platform Micro Edition,java平臺微型版)。

  如果用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進行操作,就只能通過[UIApplication sharedApplication]來獲取到UIApplication的引用,這個方法會返回一個全局的UIApplication對象給讀者。

  該UIApplication類提供了一個內(nèi)部監(jiān)督辦公室的協(xié)調(diào)運行的應(yīng)用程序的集中控制點。每個應(yīng)用程序必須有且只有一個實例UIApplication (或子類UIApplication )。當(dāng)應(yīng)用程序啟動時, UIApplicationMain函數(shù)被調(diào)用;除其他任務(wù),該函數(shù)創(chuàng)建一個單UIApplication對象。此后,您可以訪問這個對象調(diào)用由sharedApplication類的方法。一個重要的角色UIApplication的目的是處理事件的初期路由傳入的用戶。這還調(diào)度對象(行動控制消息轉(zhuǎn)發(fā)給它UIControl )到適當(dāng)?shù)哪繕藢ο?。此外?UIApplication對象維護一個窗口列出所有的( UIWindow對象)當(dāng)前打開的應(yīng)用程序,因此它可以通過這些檢索的任何應(yīng)用程序UIView對象。應(yīng)用程序?qū)ο笸ǔ1环峙湟粋€代表,一個對象,應(yīng)用程序運行時事件通知重要,例如,應(yīng)用程序啟動,低內(nèi)存警告,和應(yīng)用程序終止,給它一個機會,作出適當(dāng)?shù)姆磻?yīng)。應(yīng)用程序可以通過一個協(xié)同處理資源,如電子郵件的圖像文件或openURL:方法。

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

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

  在UIApplication接收到系統(tǒng)事件和生命周期事件時,會把相應(yīng)的事件傳遞給UIApplicationDelegate進行處理,表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)可以進行釋放內(nèi)存的操作以防止操作系統(tǒng)強制終止應(yīng)用程序的運行。

 


  

版權(quán)與免責(zé)聲明

凡本網(wǎng)注明“出處:維庫電子市場網(wǎng)”的所有作品,版權(quán)均屬于維庫電子市場網(wǎng),轉(zhuǎn)載請必須注明維庫電子市場網(wǎng),http://www.hbjingang.com,違反者本網(wǎng)將追究相關(guān)法律責(zé)任。

本網(wǎng)轉(zhuǎn)載并注明自其它出處的作品,目的在于傳遞更多信息,并不代表本網(wǎng)贊同其觀點或證實其內(nèi)容的真實性,不承擔(dān)此類作品侵權(quán)行為的直接責(zé)任及連帶責(zé)任。其他媒體、網(wǎng)站或個人從本網(wǎng)轉(zhuǎn)載時,必須保留本網(wǎng)注明的作品出處,并自負版權(quán)等法律責(zé)任。

如涉及作品內(nèi)容、版權(quán)等問題,請在作品發(fā)表之日起一周內(nèi)與本網(wǎng)聯(lián)系,否則視為放棄相關(guān)權(quán)利。

廣告
OEM清單文件: OEM清單文件
*公司名:
*聯(lián)系人:
*手機號碼:
QQ:
有效期:

掃碼下載APP,
一鍵連接廣大的電子世界。

在線人工客服

買家服務(wù):
賣家服務(wù):
技術(shù)客服:

0571-85317607

網(wǎng)站技術(shù)支持

13606545031

客服在線時間周一至周五
9:00-17:30

關(guān)注官方微信號,
第一時間獲取資訊。

建議反饋

聯(lián)系人:

聯(lián)系方式:

按住滑塊,拖拽到最右邊
>>
感謝您向阿庫提出的寶貴意見,您的參與是維庫提升服務(wù)的動力!意見一經(jīng)采納,將有感恩紅包奉上哦!