智汇工业-智慧工业、智能制造及工业智能、工业互联门户网站,专业的工业“互联网+”传媒

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

來源:網絡

點擊:1155

A+ A-

所屬頻道:新聞中心

關鍵詞: iPhone,委托模式,生命周期

      每個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);

     ?。踦ool 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()方法,委托類在這個方法內可以進行釋放內存的操作以防止操作系統強制終止應用程序的運行。

    (審核編輯: 智匯小新)

    聲明:除特別說明之外,新聞內容及圖片均來自網絡及各大主流媒體。版權歸原作者所有。如認為內容侵權,請聯系我們刪除。

    主站蜘蛛池模板: 新房_二手房_别墅_全包装修-天美艺装饰【官网】-深圳装修公司 | 数控立式车铣复合加工中心_数控立车_卧式加工中心_阀门专机-华电数控 | 山东致合必拓环保科技股份有限公司 | 联系我们果博福布斯公司客服电话17787888880[河南河北区] | 拉力试验机|电子万能试验机|液压万能试验机|摩擦磨损试验机|济南试验机厂家-济南思达测试技术有限公司 | 质量技术监督12365防伪追溯平台-www.12365china.net | 一体化净水器设备-浸没式膜水处理设备-智慧水务-超滤膜-模块化净水设备-浙江华晨环保有限公司 | 途远VR+_成都VR全景制作_成都360全景漫游_成都720全景航拍_成都途远科技有限公司 | 连续式回转炉_间歇式回转炉_燃气式回转炉_电加热回转炉-长兴博达机械配件有限公司 | 企业微信服务商-企业微信crm营销|认证-[朝阳企客通]一款企微管家服务型产品 | 企业宣传片制作公司-广告宣传片拍摄-专题片,tvc广告制作-拍摄微电影影视公司-艺虎文化 | 泊头市特种油泵阀制造有限公司 - 渣油泵,重油泵,沥青泵,高压齿轮泵,煤焦油泵,导热油泵,三螺杆泵,圆弧齿轮泵,不锈钢齿轮泵, | 网络公关公司_舆情监测_危机公关_品牌公关_一夜红传媒 | 硬度计,里氏硬度计,布氏硬度计,高强螺栓检测仪,平板导热仪,专业无损检测仪器商-北京时代新天测控技术有限公司-北京时代新天测控技术有限公司 | 室内去除甲醛检测治理十大品牌_去除甲醛公司加盟-优吸环保科技有限公司集团总部官网 | 上海希喆机械有限公司-Schunk雄克,雄克卡盘, 雄克机械手, B+R贝加莱, ELCIS编码器,艾西斯编码器, TWK编码器,Nexen,Joyce dayton升降机,Thomson汤姆森,TPG减速机,INA导轨。 | 机械配件加工_数控车床加工_零件加工_精密件加工_cnc加工定制—深圳精密机械加工 | 原创软文新闻稿-网站SEO文章代写-征文演讲稿代笔-写作阁 | 名片印刷,名片制作,名片设计,印刷彩色名片,数码快印名片-北京瑞思凯信息咨询公司 | 重庆监控-监控系统-大型弱电工程-重庆万建电子工程有限责任公司是智能化一级工程公司 | 模具配件加工厂|东莞模具配件加工|模具配件加工厂|精密塑胶模具配件|东莞市优迪精密模具制品有限公司 | 重庆污水处理设备_废气处理设备_纯净水设备-山艺环保 | 离子交换树脂_阴离子交换树脂_阳离子交换树脂-中国树脂网 | 进销存软件|仓库管理软件|库存物资出入库|ERP生产|MRP|易特软件官方网站 | 览众房车,房车, 房车厂家, 房车价格, 房车图片,, 四驱房车, 皮卡房车, 越野房车, 依维柯房车, 国产房车, 自动挡房车, | 找网页游戏鬼服 高返利鬼服游戏平台 鬼服开服表 - 猫游戏鬼服大全 | 语音芯片_蓝牙芯片_ble数传芯片_蓝牙数传模块厂家_拓达半导体-蓝牙数传芯片模块原厂 | 上海离婚律师|上海婚姻律师|上海家畅家事律师-上海家畅离婚律师网 | 乌鲁木齐万疆通管道设备有限公司 销售热线;13565955557-新疆 乌鲁木齐 万疆通 管道设备 波纹补偿器 膨胀节 金属软管 伸缩器 管件 阀门 维修 | 山东鑫佳日化_洗衣粉生产厂家,从事洗衣粉加工出口 | 太原仪诚实验室设备有限公司 | 企好网 - 中国B2B产业互联网践行者|百度爱采购官方授权一级服务商 | 荧光显微镜,倒置显微镜,显微镜相机,荧光光源——广州市明美光电技术有限公司 | 山东荣利中石油机械有限公司| 化工招聘网 化工人才网|化工英才网-化工企业招聘首选网站 | 新东方大学考试官网_考研/英语/雅思/托福/四六级/日语/韩语/教资在线网课官网 | 气动球阀 - 电动球阀 - 电站阀 - 汗越阀门 | 上海离婚律师|上海婚姻律师|上海家畅家事律师-上海家畅离婚律师网 | 山东日兴新材料股份有限公司 | 热电阻_热电偶_压力表_压力变送器_磁翻板液位计 - 淮安忠和测控仪表有限公司 | 手术示教系统-实训示教系统-数字化手术室-直播录播系统 - 深圳市视源视讯技术有限公司 |