要想清晰的理解IOS應用程序的啟動過程,,毫無疑問需要深入了解一下ios應用程序的文件系統(tǒng)。一個ios應用程序都有一個屬于自己沙盒(sandbox),,應用沙盒就是文件系統(tǒng)目錄,,并且與文件系統(tǒng)的其他部分隔離。應用必須待在自己的沙盒里,,應用既不能訪問其他應用的沙盒,,其他應用也不能訪問該沙盒。
應用沙盒包含多個目錄: 1.應用程序包(application bundle):包含所有的資源文件和可執(zhí)行文件,,并且是只讀文件目錄,。 注意:每個應用程序可以有多個程序包,但是只能有一個主程序包,,即包含應用程序代碼的程序包,。當用戶啟動應用程序的時候,應用程序會在主程序包中尋找即刻要用到的代碼和資源,,并將其加載到內存,。然后它可以根據需要動態(tài)(并延時)加載主程序包或者叢屬程序包中的代碼和資源,。應用程序可以用NSBundle 和Core Foundation 的CFBundleRef(在過程化的語言中使用)定位程序包中的資源。在Objective-C中,,首先要獲得一個NSBundle實例,,它和某個物理程序包對應。如需獲得應用程序主程序包,,則應調用mainBundle類方法。然后調用NSBundle的其他方法,,傳入文件名,、擴展名以及(可選)程序包子目錄,這些方法將會返回程序包資源的路徑,。有了資源路徑,,您就可以使用恰當的類將其加載到內存。代碼案例有:
[cpp] view plaincopy
2.偏好設置文件(Library/Preferences/):存放所有的偏好設置。通過NSUserDefaults類可以讀取寫入該文件,,同時可以作為應用的默認啟動設置,,即應用的setting會在該目錄中查找應用的設置信息。 3.臨時文件(tmp/):用于保存程序運行時所需的臨時數據,,使用完畢后的臨時數據對應的文件將從該目錄下刪除,。同時,應用結束時也可能會清除該目錄下的文件,。在程序運行時可以通過方法NSTemporaryDirectory可以的得到該沙盒下tmp目錄的全路徑,。 4.應用運行時保留的數據(Documents/):保存應用運行時生成的需要保留的數據。該文件對于在設備發(fā)生故障時,,通過ituns同步設備備份該目錄,,從而可以恢復應用的數據。 5.保存應用運行時生成的需要保留的數據(Library/Caches):與4的不同之處時ituns同步不能備份該目錄,。因為該緩存數據的體積比較大,,會延長同步設備所需的時間。但是如果數據源在別處(例如,,網絡的服務器),,那么可以通過將數據保存在該目錄。當用戶需要恢復設備,,可以從服務器下載這些數據,。 可以總結一下,Library/Preferences/,、Documents/ 下的文件時可以通過iTuns同步設備時進行備份目錄,,而tmp/,、Documents/是不能備份的。用表格表示如下:
上面介紹了沙盒的文件系統(tǒng)結構,,下面繼續(xù)講應用程序包中文件,這里面的資源文件以及可執(zhí)行文件是程序工程開發(fā)時產生的,。它基本上包含了:
[cpp] view plaincopy
main函數仍然是程序的入口函數,,其中argc,、argv為運行程序的支持命令行的參數輸入,而后面的兩個參數最后再講,。之后可以看到重要的黑體程序行——UIApplicationMain 的調用,,通過它完成系統(tǒng)啟動的過程,并形成一個事件驅動,。那么是如何完成系統(tǒng)的啟動過程呢,?可以參照Apple提供的啟動流程圖:
可以看到UIApplication首先會去查看info.plist中記錄的一些應用的基本信息(如下圖),其中最重要的是應用程序啟動資源文件的名稱(nib文件,,名稱用Main nib File base name鍵指定),,如何創(chuàng)建的是universe的應用,那么還會包含ipad的啟動資源文件的名稱,。從下圖中我們還看到了應用圖標文件以及支持方向感應器的方向,。
從工程文件中找到Main nib file對應的MainWindow_iPhone.xib文件,可以看到有四個基本的項目: 1.File’s Owner 對象:實際上就是 UIApplication 的實例,。 2.First Responder 對象:每個程序都會有一個第一響應者,,比如鼠標事件,鍵盤事件等,,它就是對應的那個對象,。比如多文檔程序中,,menu的響應事件一般都是連接到FirstResponder中去的,因為主界面一般都在別的nib里面,,此時的FirstResponder就是你的那個主nib的FileOwner,。 3.Delegate 對象:每個程序都有一個工程名+AppDelegate類,即為該Delegate的實現(xiàn),。 4.Window:應用程序啟動的時候所顯示的窗口,。 程序啟動時,那么就會發(fā)送消息給UIApplication的Delegate對象,,就會調用AppDelegate類的applicationDidFinishLaunching: 方法,。因此可以在MainWindow_iPhone.xib指定某個特定的Delegate對象,從而啟動的位置會發(fā)生改變,。 而在Delegate類中的applicationDidFinishLaunching:會初始化window對象,,即程序啟動時候的顯示窗口。 具體的代碼為:
[cpp] view plaincopy
綜上所述,,程序啟動的流程為:
講到這里,如果沒有版本的更新問題,,其實是可以結束了,。而在XCode4.2版本之后,可能沒有了Main.xib來載入初始界面,。那么就不得不使用UIApplicationMain指定入口,。前面講到了UIApplicationMain含有四個參數,這里可以將UIApplicationMain(argc, argv, nil, nil);變成UIApplicationMain(argc, argv, nil,NSStringFromClass([AppDelegate class]));,。這里的AppDelegate為你要完成初始化界面的delegate,。
除了上面的改變,版本更新還添加了故事板(storyBoard),,那么上面說的程序流程就不使用,,請記住。
PS:對于iPhone app,你無法訪問iPhone整個的文件系統(tǒng),,而只能訪問iPhone app的Home目錄中的文件,。在程序中可以用下面的方式來訪問文件目錄: 方法1:
[cpp] view plaincopy
[cpp] view plaincopy
|
|