偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

深入iPhone開(kāi)發(fā):應(yīng)用程序核心探秘

移動(dòng)開(kāi)發(fā) iOS
每個(gè)iPhone應(yīng)用程序都基于UIKit框架而構(gòu)建,因此擁有同樣的核心架構(gòu),本文提供了一個(gè)核心應(yīng)用程序架構(gòu)和高級(jí)別定制點(diǎn)方面的總體描述來(lái)幫助你做出決定。

每個(gè)iPhone應(yīng)用程序都基于UIKit框架而構(gòu)建,因此擁有同樣的核心架構(gòu)。UIKit提供運(yùn)行應(yīng)用程序的關(guān)鍵對(duì)象并且協(xié)調(diào)用戶輸入處理和屏幕內(nèi)容顯示。應(yīng)用程序彼此之間區(qū)分開(kāi)來(lái)的地方在于如何配置這些缺省對(duì)象和它們?nèi)绾伟炎远x對(duì)象整合到它們的應(yīng)用程序用戶界面和行為中。

51CTO推薦專(zhuān)題:iPhone應(yīng)用程序開(kāi)發(fā)初探

盡管定制你的應(yīng)用程序用戶界面和基本行為發(fā)生在你的自定義代碼中,仍然有很多定制必須使用在應(yīng)用程序的***層。因?yàn)檫@些應(yīng)用層的定制影響了你的應(yīng)用程序和系統(tǒng)以及其它安裝程序之間的交互方式,理解什么時(shí)候該采取行動(dòng)而什么時(shí)候默認(rèn)行為已經(jīng)足夠這一點(diǎn)很重要。本文提供了一個(gè)核心應(yīng)用程序架構(gòu)和高級(jí)別定制點(diǎn)方面的總體描述來(lái)幫助你做出決定。

核心應(yīng)用程序架構(gòu)

從你的程序被用戶啟動(dòng),到它退出,UIKit框架管理著大多數(shù)應(yīng)用程序關(guān)鍵基礎(chǔ)結(jié)構(gòu)。一個(gè)iPhone應(yīng)用程序不斷從系統(tǒng)中接收事件并必須響應(yīng)這些事件。接收事件是UIApplication 對(duì)象的工作但是響應(yīng)這些事件是你自定義代碼的責(zé)任。為了理解你在哪些地方需要響應(yīng)事件,其實(shí),這對(duì)理解一點(diǎn)整個(gè)應(yīng)用程序生命周期和事件循環(huán)也有幫助。下面的章節(jié)描述了這些周期并且還提供了一些貫穿iPhone應(yīng)用程序開(kāi)發(fā)的核心設(shè)計(jì)模式的總結(jié)。(相關(guān)推薦:專(zhuān)訪最牛iPhone開(kāi)發(fā)團(tuán)隊(duì):走進(jìn)移動(dòng)開(kāi)發(fā)

應(yīng)用程序生命周期

應(yīng)用程序生命周期構(gòu)成發(fā)生在你的應(yīng)用程序啟動(dòng)和退出期間的事件序列。在iPhone 操作系統(tǒng)中, 用戶通過(guò)點(diǎn)擊桌面上的菜單啟動(dòng)你的應(yīng)用程序。在點(diǎn)擊發(fā)生之后的短時(shí)間內(nèi),系統(tǒng)顯示一些過(guò)渡圖片并開(kāi)始通過(guò)調(diào)用main函數(shù)啟動(dòng)你的應(yīng)用程序。從這一點(diǎn)開(kāi)始,一大堆的初始化工作被移交給UIKit,它將加載應(yīng)用程序的用戶界面并準(zhǔn)備好它的事件循環(huán)。在事件循環(huán)期間,UIKit 協(xié)調(diào)你自定義對(duì)象的事件交付和應(yīng)用程序發(fā)出命令的響應(yīng)。當(dāng)用戶執(zhí)行一個(gè)動(dòng)作會(huì)讓你的應(yīng)用程序退出時(shí),UIKit通知你的應(yīng)用程序并開(kāi)始這個(gè)結(jié)束過(guò)程。

圖1-1 描繪了一個(gè)iPhone應(yīng)用程序的簡(jiǎn)單生命周期。這個(gè)圖顯示了應(yīng)用程序啟動(dòng)到退出期間發(fā)生的事件序列。在初始化和結(jié)束階段,UIKit發(fā)送特定的消息給應(yīng)用程序代理對(duì)象以便其知道發(fā)生了什么。在事件循環(huán)階段,UIKit分發(fā)事件給你的應(yīng)用程序自定義事件處理器。處理初始化和結(jié)束事件在“Initialization and Termination,” 中描述,而事件處理過(guò)程在“The Event-Handling Cycle” 中介紹,在后面的章節(jié)將覆蓋更多的細(xì)節(jié)。

圖1-1  應(yīng)用程序生命周期 
圖 1-1  應(yīng)用程序生命周期

Main函數(shù)

在iPhone應(yīng)用程序里, main函數(shù)功能被最小化了。大部分實(shí)際工作是在UIApplicationMain 函數(shù)中完成的。 當(dāng)你在Xcode中開(kāi)始一個(gè)新的應(yīng)用程序項(xiàng)目時(shí),每個(gè)項(xiàng)目模版都提供了一個(gè)標(biāo)準(zhǔn)main函數(shù)實(shí)現(xiàn)如同在 “Handling Critical Application Tasks.”里的那個(gè)。Main函數(shù)只做了三件事: 創(chuàng)建了一個(gè)自釋放池(autorelease pool),調(diào)用UIApplicationMain,然后釋放autorelease pool。 除了很少的特例,你不應(yīng)該修改它。

  1. iPhone應(yīng)用程序的main函數(shù)  
  2. #import <UIKit/UIKit.h> 
  3.  
  4. int main(int argc, char *argv[])  
  5.    
  6. {  
  7.    
  8.     NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];  
  9.    
  10.     int retVal = UIApplicationMain(argc, argv, nil, nil);  
  11.    
  12.     [pool release];  
  13.    
  14.     return retVal;  
  15.    

注意: 自釋放池用在內(nèi)存管理中。它是一個(gè)Cocoa機(jī)制用來(lái)延遲在一個(gè)函數(shù)體內(nèi)創(chuàng)建的對(duì)象的釋放。更多信息參見(jiàn)Memory Management Programming Guide for Cocoa。對(duì)于和自釋放池相關(guān)的iPhone應(yīng)用程序特定的內(nèi)存管理指南,參見(jiàn)“Allocating Memory Wisely.”

上述列表中的中心部分UIApplicationMain函數(shù)采用了4個(gè)參數(shù)并使用它們來(lái)初始化應(yīng)用程序。盡管你沒(méi)必要更改傳入?yún)?shù)的默認(rèn)值,還是值得解釋一下它們起動(dòng)應(yīng)用程序時(shí)的用途。除了argc 和 argv 參數(shù)外,這個(gè)函數(shù)采用兩個(gè)字符串參數(shù)來(lái)識(shí)別基本類(lèi)(也就是,應(yīng)用程序?qū)ο箢?lèi))和應(yīng)用程序代理類(lèi)。如果這個(gè)基本類(lèi)字符串為空,UIKit使用UIApplication類(lèi)作為缺省值。

如果應(yīng)用程序代理類(lèi)為空,UIKit假設(shè)它為從你的應(yīng)用程序主nib文件加載的對(duì)象其中之一(對(duì)于使用Xcode模版創(chuàng)建的應(yīng)用程序)。 設(shè)置這些參數(shù)任意一個(gè)為非空數(shù)值將導(dǎo)致UIApplicationMain 函數(shù)在應(yīng)用程序啟動(dòng)時(shí)創(chuàng)建一個(gè)相應(yīng)類(lèi)實(shí)例并為聲明的目的使用它。這樣,如果你的應(yīng)用程序使用一個(gè)自定義的UIApplication子類(lèi)(不推薦這樣,但是當(dāng)然是可能的),你將在第三個(gè)參數(shù)中指定你自定義類(lèi)的名字。

#p#

應(yīng)用程序代理

監(jiān)控你的應(yīng)用程序的高層行為是應(yīng)用程序代理對(duì)象的職責(zé),也就是你提供的自定義對(duì)象。代理是用來(lái)避免子類(lèi)化復(fù)雜UIKit對(duì)象的一個(gè)機(jī)制,比如缺省的UIApplication對(duì)象。和使用子類(lèi)化以及重寫(xiě)父類(lèi)方法相反,你無(wú)需修改就可以使用這個(gè)復(fù)雜對(duì)象而把自定義的代碼放在代理類(lèi)中。當(dāng)感興趣的事件發(fā)生時(shí),這個(gè)復(fù)雜對(duì)象發(fā)送消息給你的代理對(duì)象。你可以使用這些“鉤子”來(lái)執(zhí)行自定義代碼并實(shí)現(xiàn)你需要的行為。

重要: 這個(gè)代理設(shè)計(jì)模式是用來(lái)節(jié)約你創(chuàng)建應(yīng)用程序的時(shí)間和精力的。所以理解這個(gè)模式很重要。想對(duì)iPhone應(yīng)用程序采用的關(guān)鍵設(shè)計(jì)模式有個(gè)總體了解,請(qǐng)參見(jiàn)“Fundamental Design Patterns.” 關(guān)于代理和其他UIKit設(shè)計(jì)模式的更詳細(xì)的描述,請(qǐng)參見(jiàn)Cocoa Fundamentals Guide.

應(yīng)用程序代理對(duì)象負(fù)責(zé)處理一些關(guān)鍵的系統(tǒng)消息而且在每個(gè)iPhone應(yīng)用程序中必須存在。這個(gè)對(duì)象可以是任何你喜歡的類(lèi)實(shí)例,只要它采用了UIApplicationDelegate 協(xié)議。 這個(gè)協(xié)議的方法定義了應(yīng)用程序生命周期掛載的鉤子,同時(shí)也是你實(shí)現(xiàn)自定義行為的途徑。盡管你不需要實(shí)現(xiàn)所有的方法,每個(gè)應(yīng)用程序代理應(yīng)該實(shí)現(xiàn)在“Handling Critical Application Tasks.”中描述的方法。

主Nib文件

另外一個(gè)初始化時(shí)期發(fā)生的任務(wù)是加載應(yīng)用程序的主nib文件。如果應(yīng)用程序信息property list (Info.plist) 文件包含了NSMainNibFile關(guān)鍵值, 作為初始化過(guò)程的一部分,UIApplication 對(duì)象加載這個(gè)關(guān)鍵值指定的nib文件。主nib文件是為你自動(dòng)加載的唯一nib文件;但是,你可以按照需要加載其他的nib文件。

Nib 文件是基于磁盤(pán)的資源文件,保存了一個(gè)或多個(gè)對(duì)象的一份快照。 一個(gè)iPhone應(yīng)用程序的主nib文件通常包含一個(gè)窗口對(duì)象,應(yīng)用程序代理對(duì)象,和可能一個(gè)或多個(gè)其他管理這個(gè)窗口的關(guān)鍵對(duì)象。加載一個(gè)nib文件重新構(gòu)成nib文件中的對(duì)象,從它的磁盤(pán)表示轉(zhuǎn)換成一個(gè)實(shí)際的可以被你的應(yīng)用程序操作的內(nèi)存版本。

從nib文件中加載的對(duì)象和你編程序創(chuàng)建的對(duì)象沒(méi)有區(qū)別。不過(guò),對(duì)于用戶界面而言,圖形化的創(chuàng)建和用戶界面相關(guān)聯(lián)的對(duì)象并存放在nib文件中(使用Interface Builder)比編程實(shí)現(xiàn)要簡(jiǎn)便直觀得多。

#p#

事件處理循環(huán)

當(dāng)UIApplicationMain 函數(shù)初始化了應(yīng)用程序之后,它起動(dòng)必要的基礎(chǔ)組件來(lái)管理這個(gè)應(yīng)用程序的事件和繪制循環(huán),這在圖Figure 1-2中描述。當(dāng)用戶和設(shè)備交互時(shí),iPhone OS 偵測(cè)觸摸事件并把它們放到應(yīng)用程序事件隊(duì)列中。UIApplication對(duì)象的事件處理組件從事件隊(duì)列頂部提取每個(gè)事件并遞交給最合適的對(duì)象來(lái)處理它。比如,一個(gè)發(fā)生在一個(gè)按鈕上的觸摸事件將會(huì)被遞交給相應(yīng)的按鈕對(duì)象。事件也可以被遞交給控制器對(duì)象(controller objects)和其他不是直接負(fù)責(zé)處理該觸摸事件的對(duì)象。

圖1-2  事件和繪畫(huà)循環(huán) 
圖 1-2  事件和繪畫(huà)循環(huán)

在iPhone OS 多點(diǎn)觸摸事件模型中,觸摸數(shù)據(jù)被包裝在一個(gè)簡(jiǎn)單的事件對(duì)象中(UIEvent)。為了跟蹤單獨(dú)的觸摸動(dòng)作,事件對(duì)象中包含了觸摸對(duì)象(UITouch),每一個(gè)代表一個(gè)手指觸摸了屏幕。當(dāng)這個(gè)用戶把手指放在屏幕上,并四處移動(dòng)它們,***從屏幕上移開(kāi),系統(tǒng)會(huì)在相應(yīng)的觸摸對(duì)象中報(bào)告每個(gè)手指的變化。

當(dāng)應(yīng)用程序啟動(dòng)時(shí),系統(tǒng)為這個(gè)應(yīng)用程序創(chuàng)建一個(gè)進(jìn)程和線程。這個(gè)初始線程成為應(yīng)用程序主線程, UIApplication 對(duì)象就在這里建立主運(yùn)行循環(huán)(main run loop)并配置應(yīng)用程序的事件處理編碼。圖1-3 顯示了事件處理編碼和主運(yùn)行循環(huán)之間的關(guān)系。系統(tǒng)發(fā)送的觸摸事件被排隊(duì)直到它們能被應(yīng)用程序的主循環(huán)處理。

在主運(yùn)行循環(huán)中處理事件 
圖1-3  在主運(yùn)行循環(huán)中處理事件

注意: 一個(gè)運(yùn)行循環(huán)監(jiān)控一個(gè)給定的執(zhí)行線程的輸入源。當(dāng)一個(gè)輸入源有數(shù)據(jù)處理時(shí),這個(gè)運(yùn)行循環(huán)喚醒線程并把控制權(quán)派發(fā)給輸入源處理器。當(dāng)處理完成時(shí),控制權(quán)返回運(yùn)行循環(huán),繼續(xù)下一個(gè)事件或者如果沒(méi)有什么事情做的話就讓這個(gè)線程休眠。你可以安裝你自己的輸入源,包括端口和時(shí)鐘,在一個(gè)運(yùn)行循環(huán)中使用基礎(chǔ)框架中的NSRunLoop 類(lèi)。

UIApplication用一個(gè)輸入源對(duì)象配置主運(yùn)行循環(huán)來(lái)處理觸摸事件,把它們分發(fā)給合適的響應(yīng)者對(duì)象。一個(gè)響應(yīng)者對(duì)象是從UIResponder 類(lèi)繼承而來(lái)并且實(shí)現(xiàn)了一個(gè)或多個(gè)處理觸摸事件不同階段的方法。應(yīng)用程序中的響應(yīng)者對(duì)象包括UIApplication實(shí)例,UIWindow,UIView,和所有UIView子類(lèi)。 應(yīng)用程序通常分發(fā)事件給代表應(yīng)用程序的主窗口的UIWindow 對(duì)象。這個(gè)窗口對(duì)象,依次,轉(zhuǎn)發(fā)這個(gè)事件給它的***響應(yīng)者first responder,這通常是發(fā)生觸摸事件的視圖對(duì)象(UIView)。

除了定義處理事件的方法之外,UIResponder類(lèi)還定義了響應(yīng)者鏈的程序結(jié)構(gòu),這是一個(gè)協(xié)同事件處理的Cocoa機(jī)制。響應(yīng)者鏈?zhǔn)菓?yīng)用程序中的一個(gè)響應(yīng)者對(duì)象連接序列,通常從***響應(yīng)者開(kāi)始。如果***響應(yīng)者對(duì)象不能處理這個(gè)事件,它傳遞給響應(yīng)鏈中的下一個(gè)。這個(gè)消息繼續(xù)回溯響應(yīng)鏈-給更高級(jí)別的響應(yīng)者對(duì)象比如窗口,應(yīng)用程序,和應(yīng)用程序代理-直到事件被處理。如果事件最終仍然未被處理,則被拋棄。

處理事件的響應(yīng)者對(duì)象傾向于在移動(dòng)中設(shè)置一系列程序動(dòng)作而導(dǎo)致應(yīng)用程序重畫(huà)所有或它的用戶界面的一部分(以及其它可能的輸出,比如播放聲音)。例如,一個(gè)控制器對(duì)象 (也就是,一個(gè)UIControl子類(lèi)),通過(guò)發(fā)送一個(gè)動(dòng)作消息給另外一個(gè)對(duì)象來(lái)處理一個(gè)事件,通常這個(gè)控制器管理著當(dāng)前激活視圖集。當(dāng)處理當(dāng)前消息時(shí),這個(gè)控制器可能改變用戶界面或者調(diào)整視圖位置,需要部分視圖重新繪制自己。當(dāng)這個(gè)發(fā)生時(shí),視圖和繪圖基礎(chǔ)組件接管并以可能的最有效率的方式來(lái)處理這些必要的重繪事件。

基本設(shè)計(jì)模式

UIKit框架的設(shè)計(jì)融合了許多Mac OS X上的Cocoa應(yīng)用程序創(chuàng)建的設(shè)計(jì)模式。理解這些模式對(duì)于創(chuàng)建iPhone應(yīng)用程序是關(guān)鍵的,所以值得花一些時(shí)間來(lái)了解它們。下面提供了一個(gè)這些設(shè)計(jì)模式的總體描述:

基本設(shè)計(jì)模式

 

 

【編輯推薦】

  1. iPhone應(yīng)用開(kāi)發(fā)實(shí)戰(zhàn)全解
  2. 專(zhuān)題:iPhone應(yīng)用程序開(kāi)發(fā)初探 
  3. 專(zhuān)訪最牛iPhone開(kāi)發(fā)團(tuán)隊(duì):走進(jìn)移動(dòng)開(kāi)發(fā) 
責(zé)任編輯:王曉東 來(lái)源: CSDN博客
相關(guān)推薦

2011-07-26 09:41:23

iPhone xcode Mac OS X

2011-08-12 14:54:45

iPhone委托

2011-08-05 13:49:53

iPhone 應(yīng)用 開(kāi)發(fā)

2011-07-21 10:47:37

iPhone Cocoa 委托

2011-07-26 11:13:15

iPhone PXL

2011-08-10 09:31:33

開(kāi)發(fā)iPhone應(yīng)用程

2010-03-01 17:53:22

Python應(yīng)用程序

2011-04-29 10:46:32

iPhone開(kāi)發(fā)入門(mén)iPhoneiOS

2011-08-17 16:12:20

iPhone應(yīng)用程序

2011-08-17 16:16:29

iPhone應(yīng)用程序啟動(dòng)過(guò)程

2010-02-06 16:02:57

Android 應(yīng)用程

2010-08-04 09:43:28

Flex應(yīng)用程序

2010-08-18 10:13:55

IntentAndroid

2011-07-20 15:58:58

iPhone 應(yīng)用程序 生命周期

2011-07-21 15:56:32

iPhone 截屏

2011-07-27 17:30:40

iPhone Locate 定位

2011-07-19 14:36:32

iPhone

2009-12-23 10:18:21

ADO.NET 應(yīng)用程

2009-11-16 17:33:47

2010-01-25 17:14:44

Android應(yīng)用程序
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)