3.2
應用剖析
這一節我們從應用的類圖如入手,了解應用中有哪些類,以及這個類中的方法、成員變量和屬性。nib檔案有哪些。還會介紹mvc設計模式等。
3.2.1 核心類圖
在該應用中涉及到9個類,1個協定如圖3-8所示。
圖3-8
核心類圖
在類圖其中有3個是cocoa touch提供的基類,即:uiviewcontroller、uiview和nsobject,其它的6個類由我們編寫。還有1個協定uiapplicationdelegate。
這些類和協定的作用如表3-1所示:
表3-1類和協定表
類名或協定
作用
備注
uiviewcontroller
視圖控制器基類
基類
uiview
視圖基類
nsobject
objective-c根類
rootviewcontroller
應用中的根控制器
應用程式類
mainviewcontroller
主視圖的視圖控制器
flipsideviewcontroller
背後視圖的視圖控制器
mainview
主視圖的視圖
flipsideview
背後視圖的視圖
uiapplicationdelegate
應用程式委托協定
協定
passwordgenappdelegate
應用程式委托
3.2.2 rootviewcontroller類
rootviewcontroller是根控制器,它控制其它的視圖控制器。rootviewcontroller類中的成員變量和方法如表3-2所示:
表3-2 rootviewcontroller類表
類成員
變量或方法類型
類型或傳回類型
說明
infobutton
成員變量
iboutlet uibutton*
定義有輸出口的按鈕
flipsidenavigationbar
iboutlet uinavigationbar*
背後視圖的導航欄
iboutlet mainviewcontroller*
主視圖控制器
iboutlet flipsideviewcontroller*
背後視圖控制器
viewdidload
方法
void
視圖加載完成回調方法
dealloc
對象釋放回調方法
didreceivememorywarning
記憶體報警時候回調方法
shouldautorotatetointerfaceorientation
bool
視圖控制器支援某個方向旋轉時候傳回yes
toggleview
ibaction
點選按鈕或done按鈕時候調用
loadflipsideviewcontroller
初始化背後視圖控制器
其中按鈕的iboutlet(輸出口)變量是infobutton,在cocoa程式設計中一個控件是否定義輸出口是要看這個控件是否需要通過程式代碼改變它的狀态,例如:如果我們需要在控制器中改變按鈕的背景或文字,我們就需要為該按鈕控件定義輸出口。
3.2.3 mainviewcontroller類
mainviewcontroller是主視圖控制器,mainviewcontroller類中的成員變量和方法如表3-3所示:
表3-3 mainviewcontroller類表
createpassword
定義有輸出口的[color=windowtext ]generate password按鈕
emailpassword
定義有輸出口的e-mail password按鈕
定義有輸出口的generate password和e-mail password按鈕定義輸出口是因為需要在控制器的viewdidload方法初始化這兩個按鈕狀态。
3.2.4 flipsideviewcontroller類
flipsideviewcontroller是背後視圖控制器,flipsideviewcontroller類中的成員變量和方法如表3-4所示:
表3-4 flipsideviewcontroller類表
類成員
變量或方法類型
類型或傳回類型
說明
viewdidload
方法
void
視圖加載完成回調方法
dealloc
對象釋放回調方法
didreceivememorywarning
記憶體報警時候回調方法
shouldautorotatetointerfaceorientation
bool
視圖控制器支援某個方向旋轉時候傳回yes
3.2.5 mainview類
mainview是主視圖,mainview類中的成員變量和方法如表3-5所示:
表3-5 mainview類表
passwordlength
成員變量
iboutlet uitextfield*
定義有輸出口的密碼長度文本框
includelowercase
iboutlet uiswitch*
定義有輸出口的包含小寫開關控件
includenumbers
定義有輸出口的包含數字開關控件
includepunctuation
定義有輸出口的包含标點符号開關控件
includeuppercase
定義有輸出口的包含大寫開關控件
showphonetics
定義有輸出口的是否顯示發音開關控件
password
定義有輸出口的密碼文本框
phoneticpassword
iboutlet uitextview*
定義有輸出口的顯示發音文本視圖
emailpasswordbutton
iboutlet uibutton*
定義有輸出口的發送email按鈕
setpasssword
ibaction
點選generate password按鈕時候調用
resignresponder
放棄密碼文本框和密碼長度文本框的第一響應者
emailpassword
點選e-mail password按鈕時候調用
emailaddress成員變量,但是從來沒有使用過!還有比較嚴重的問題是,在該類中沒有重寫dealloc方法,該方法是對象釋放回調方法,在該方法中用來釋放類中的成員變量,代碼如下:
- (void)dealloc {
[passwordrelease];
… …
[superdealloc];
}
dealloc非常重要,特别是有很多成員變量需要釋放記憶體時候,而在該類中沒有重寫這個方法,這也是我們應該摒棄和借鑒的。
3.2.6 flipsideview類
flipsideview是背後視圖,flipsideview類中的成員變量和方法如表3-6所示:
表3-6 flipsideview類表
initwithframe:
構造方法
id
視圖的構造方法
drawrect:
繪制視圖方法,本應用實際沒有使用
openlink
點選download按鈕時候調用
3.2.7 nib檔案
本應用中的nib檔案有3個:mainwindow.xib、mainview.xib和flipsideview.xib,這3個檔案解釋如下:
·
mainwindow.xib,在主視窗nib檔案,預設cocoa應用都有這個檔案,主程式在啟動的時候讀取這個檔案,根據這個檔案配置資訊啟動相應的根控制器。
mainview.xib,是主視圖的nib檔案,它是mainviewcontroller和mainview的紐帶。
flipsideview.xib,是主視圖的nib檔案,它是flipsideviewcontroller和flipsideview的紐帶。
&
檔案的字尾名是xib為什麼nib檔案?以前該檔案的字尾名是nib,官方一緻延續了nib的叫法。是以,在本書中也采用nib的叫法。
3.2.8 cocoa和cocoa touch中mvc設計模式
從上面的介紹看到應用中有很多的uiviewcontroller和uiview,還有很多nib檔案,它們之間是什麼關系呢?這與mvc設計模式有關。
蘋果的cocoa和cocoa touch采用了mvc設計模式進行設計的,所謂設計模式就是解決某一特定問題的方案。mvc是解決具有ui的應用系統的成熟解決方案,mvc解釋如下:
m-model(模型)是應用系統中與視圖對于部分的資料;
v-view(視圖)是應用系統中使用者看到并與之互動的界面;
c-controller(控制器)是應用系統中起到控制器作用,接受使用者事件,顯示資料等等,與視圖進行互動等。
cocoa是蘋果開發mac os x應用系統的架構,它是基于objective-c,它包括:foundation和appkit,cocoa架構在ios上叫做cocoa
touch,cocoa touch架構包含:foundation和uikit。
在cocoa和cocoa touch應用中嚴格按照該模式實作如圖3-9所示。在cocoa和cocoa
touch中除了視圖和視圖控制器外,還有nib檔案,nib檔案是通過interface builder工具維護,在新版的xcode 4.x後interface
builder與xcode內建在一起了,本書采用的還是xcode3.2版本,是以interface builder與xcode工具還是分開的。
圖3-9 cocoa mvc
nib檔案是視圖和控制器的“紐帶”,如圖3-10所示,通過這個“紐帶”控制器能夠控制在視圖上顯示和讀取内容,能夠接受和響應視圖上的事件。我們也可以通過nib檔案可視化地設計視圖。
圖3-10 nib檔案
無論從圖3-9還是圖3-10我們都沒有發現model(模型)的“痕迹”,在一般的簡單控件中模型類不是很突出,它可以是簡單資料類型,也可以是nsstring等objective-c中的類,也可以是我們自定義一些類,它們可以以成員變量的方式出現在視圖控制器中,也可以以成員變量的方式出現在視圖中。是以,模型可以很靈活的出現,而控制器和視圖是很明顯的,一般而言一個控制器可以控制多個視圖。