版權聲明

所有的部落格文章都可以在右邊[blog文章原始檔案]下載最原始的文字檔案,並依你高興使用 docutil 工具轉換成任何對應的格式方便離線閱覽,除了集結成書販賣歡迎任意取用,引用

簡介

Apple 官方 iPhone 手冊的 The Core Application 章節閱讀筆記。

原文連結

Core Application Architecture

iPhone 程式會有一個唯一的 UIApplication 來接收系統 event。 就像其他的 GUI 程式一樣 UIApplication 產生一個迴圈不斷擷取系統 event 並交送到程式架構中的 UIView 衍生物件處理。

The Application Life cycle

完整的生命週期就是按下程式圖示進入程式開始一直到離開程式為止。

The Main Function

iPhone 的 main() 幾乎不需要特別的更改,main()會負責啟動一個 autorelease pool, 這東西就是 Objective-C 記憶體管理中送出 autorelease 訊息的物件會暫時存放的地方, 然後呼叫 UIApplicationMain(..) 來建立 UIApplication 物件。

int main(int argc, char *argv[]) {

    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
    int retVal = UIApplicationMain(argc, argv, nil, nil);
    [pool release];
    return retVal;
}

The Application Delegate

每個 iPhone 程式都必須具備一個實現(comform) UIApplicationDelegate protocal 的物件 ,透過 UIApplicationDelegate protocal 定義的 delegates 來控制一些十分重要的 application event,像 applicationDidFinishLaunching: 代表系統告知已經完成 程式啟動步驟。

The Main Nib File

如果程式的 Info.plist 檔案內容有 key 值 NSMainNibFile , 程式在啟動的時候會依據 NSMainNibFile 指示的檔案去讀取對應的 nib (xib [1])。

http://s3.amazonaws.com/ember/HaxYLTsQKKe2nlBYCpTShbMwWENUD3fe_m.png

一般基本的 main nib 應該有一個 UIApplicationDelegate 物件, 一個 window 物件, 每個 nib 檔案都會有 File's Owner 和 First Responder , 請參考下圖途中另外包含 一個基本 View control。

http://s3.amazonaws.com/ember/bhnbBikUK2XZAE3JRxeL7Le7Y0loYZg1_m.png
[1]xib 和 nib 是一樣的檔案,只是xib檔案用xml呈現內容。

The Event-Handling Cycle

看看下圖就很清楚事件的發生和流程。

手指觸碰 iPhone -> 作業系統收到 -> 作業系統將資訊包裝完畢後丟入 queue -> Application 從 queue 取出 event -> 將取出的 event 放入 application object -> application object 將 event 丟入 responder chain [2] 流程由上至下非常清楚。

http://s3.amazonaws.com/ember/rFJiKZSPT9b0EMYybcnRMJK7q0QMSBMn_m.png
[2]Responder chain - 將所有會對 touch or motion event 有興趣的 responder [3] 串起來 依序接收 event 直到有 responder 接手處理。
[3]Responder : UIResponder 或後代類別建立的物件簡稱。

The Application Runtime Environment

iPhone 應用程式設計非常強調速度,因為手持裝置的特性,太過漫長的啟動時間和過久的 關閉程序都會讓使用者有不好的體驗。

Fast Launch, Short Use

iPhoen 要求程式月快啟動越好,並且嚴格限制程式關閉必須在5秒以內,如果5秒作不完 關閉程式的流程,作業系統會強制中斷。

基於快速進入離開的特性,設計應用程式的時候應該特別注意狀態的回覆,也就是說當程式 離開時最好能保有目前狀態,下一次進入程式可以馬上銜接上上次離開狀態。

The Application Sandbox

基於安全的理由,iPhone 的應用程式資料都被限制在一定的位置,其他應用程式沒有權限 進入存取,在文件中都稱呼這個限制的區域為 sandbox,當應用程式載入以後作業系統會 計算出一個唯一的識別符號,並用這個唯一的識別符號當作應用程式的home目錄,

The Virtual Memory System

iPhone 應用程式受限於實體記憶體大小,寫程式的時候請注意這點。

The Automatic Sleep Timer

為了省電目的 iPhone 在一段時間沒有收到 touch event 會將螢幕的背燈關掉,如果 不希望 auto sleep 這功能啟動,請使用下面程式片段:

UIApplication *app = [UIApplication sharedApplication];
app.idleTimerDisabled = YES;

Warning

關掉 idle timer 會快速消耗電力,請特別注意使用時機。

The Application Bundle

寫好應用程式後編譯時 xcode 會將應用程式包裝成一個 bundle [4] ,這編列一般 設定好的檔案和其意義:

App 執行檔,副檔名為.app
Setting.bundle Application preference
Icon.png 57X57 png 圖檔,顯示在springboard [5] 上得應用程式圖示。
Icon-setting.png 29X29 png 圖檔,顯示在設定裡 TableView 顯示用。
MainWindow.nib 預設 main nib file可在info.plist中修改。
Default.png 480X320 png 圖檔,當應用程式讀取時的背景圖案。
iTunesArtwork 512X512 和 Icon.png 一樣,不過是給 App Store用的。
info.plist 應用程式設定
en.lproj 國際化資源檔
fr.lproj...  

存取 Bundle 的程式範例

NSString *imgPath = [[NSBundle mainBundle] pathForResource:@"sun"
                                                    ofType:@"png"];
UIImage *img = [[UIImage alloc] initWithContentsOfFile:imagePath];
[4]Bundle 就是經過設計有意義的目錄。
[5]iPhone 的 Finder,將所有應用程式排列並根據使用者觸碰執行對應應用程式。

The Information Property List

Runtime Configuration Guidelines 有列舉所有支援的 key 和代表的意義,有閒可以參考。

要得到 inof.plist 的資料可以使用 NSBundle 的兩個 method objectForInfoDictionaryKey:infoDictionary , 建議使用 objectForInfoDictionaryKey: 即可。

從 info.plist 取資料的程式範例:

                   // value = icon file name
NSString *value = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleIncoFile"];

Handling Critical Application Termination(event)

章節解釋重要的系統事件 (System Event)。

Initialization and Termination

iPhone 應用程式十分要求使用者的操作體驗,因此在 initialization 和 termination 程序盡量快速小巧,非必要的處理都不要放在 initialization 和 termination 事件裡 。

事件:(在UIApplicationDelegate)
  • applicationDidFinishLaunching: : 當 os 將應用程式載入完畢會觸發
  • applicationWillTerminate: : OS 關閉應用程式前觸發

applicationDidFinishLaunching: 不是用來完成全部的初始化動作,只要把ui必備的 資料準備好,其餘大量的初始data動作不要全部丟到 applicationDidFinishLaunching event 中。

applicationWillTerminate: 在這個事件裡面儲存應用程式的狀態,以利下次啟動的 時候恢復到離開時的狀態。

Responding to Interruptions

iPhone 應用程式執行的時候有很多機會要中斷目前的操作,比如有電話近來,收到簡訊 ,使用者按下sleep按鍵或是日曆上面的事件觸發。

這類事件由兩個event掌控

  • applicationWillResignActive: 當中斷事件進來,作業系統顯示 alert 前
  • applicationDidBecomeActive: 如果 ignore alert 回答 yes 作業系統觸發這個 event 並將控制權還給應用程式。

applicationWillResignActive: 當有中斷進入的時候由系統觸發,應用程式應該在這做 必要處理,比如 Game 應該暫停畫面更新和timer之類。

applicationDidBecomeActive: 在這個event中回復 applicationWillResignActive: 中的 處理。

沒有留言:

Related Posts with Thumbnails