久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

iOS/iPhone 程序文件目錄結構以及啟動流程

 文檔集成 2014-05-13
         要想清晰的理解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的其他方法,,傳入文件名,、擴展名以及(可選)程序包子目錄,這些方法將會返回程序包資源的路徑,。有了資源路徑,,您就可以使用恰當的類將其加載到內存。代碼案例有:

  1. NSString *str=[[NSBundle mainBundle]pathForResource:@"example" ofType:@"png"];  
即可返回應用程序包中保含的example.png文件的路徑,。你可以使用str來對example.png進行操作,。

         2.偏好設置文件(Library/Preferences/):存放所有的偏好設置。通過NSUserDefaults類可以讀取寫入該文件,,同時可以作為應用的默認啟動設置,,即應用的setting會在該目錄中查找應用的設置信息。

         3.臨時文件(tmp/):用于保存程序運行時所需的臨時數據,,使用完畢后的臨時數據對應的文件將從該目錄下刪除,。同時,應用結束時也可能會清除該目錄下的文件,。在程序運行時可以通過方法NSTemporaryDirectory可以的得到該沙盒下tmp目錄的全路徑,。

         4.應用運行時保留的數據(Documents/):保存應用運行時生成的需要保留的數據。該文件對于在設備發(fā)生故障時,,通過ituns同步設備備份該目錄,,從而可以恢復應用的數據。

         5.保存應用運行時生成的需要保留的數據(Library/Caches):與4的不同之處時ituns同步不能備份該目錄,。因為該緩存數據的體積比較大,,會延長同步設備所需的時間。但是如果數據源在別處(例如,,網絡的服務器),,那么可以通過將數據保存在該目錄。當用戶需要恢復設備,,可以從服務器下載這些數據,。

          可以總結一下,Library/Preferences/,、Documents/ 下的文件時可以通過iTuns同步設備時進行備份目錄,,而tmp/,、Documents/是不能備份的。用表格表示如下:

目錄

描述

<Application_Home>/AppName.app

這是程序包目錄,,包含應用程序的本身,。由于應用程序必須經過簽名,所以您在運行時不能對這個目錄中的內容進行修改,,否則可能會使應用程序無法啟動,。

在iPhone OS 2.1及更高版本的系統(tǒng),iTunes不對這個目錄的內容進行備份,。但是,,iTunes會對在App Store上購買的應用程序進行一次初始的同步。

<Application_Home>/Documents/

您應該將所有的應用程序數據文件寫入到這個目錄下,。這個目錄用于存儲用戶數據或其它應該定期備份的信息,。有關如何取得這個目錄路徑的信息,請參見“獲取應用程序目錄的路徑”部分,。

iTunes會備份這個目錄的內容,。

<Application_Home>/Library/Preferences

這個目錄包含應用程序的偏好設置文件。您不應該直接創(chuàng)建偏好設置文件,,而是應該使用NSUserDefaults類或CFPreferences API來取得和設置應用程序的偏好,,詳情請參見“添加Settings程序包”部分。

iTunes會備份這個目錄的內容,。

<Application_Home>/Library/Caches

這個目錄用于存放應用程序專用的支持文件,,保存應用程序再次啟動過程中需要的信息。您的應用程序通常需要負責添加和刪除這些文件,,但在對設備進行完全恢復的過程中,,iTunes會刪除這些文件,因此,,您應該能夠在必要時重新創(chuàng)建,。您可以使用“獲取應用程序目錄的路徑” 部分描述的接口來獲取該目錄的路徑,并對其進行訪問,。

在iPhone OS 2.2及更高版本,,iTunes不對這個目錄的內容進行備份。

<Application_Home>/tmp/

這個目錄用于存放臨時文件,,保存應用程序再次啟動過程中不需要的信息,。當您的應用程序不再需要這些臨時文件時,應該將其從這個目錄中刪除(系統(tǒng)也可能在應用程序不運行的時候清理留在這個目錄下的文件),。有關如何獲得這個目錄路徑的信息,,請參見“獲取應用程序目錄的路徑”部分。

在iPhone OS 2.1及更高版本,,iTunes不對這個目錄的內容進行備份,。

         上面介紹了沙盒的文件系統(tǒng)結構,,下面繼續(xù)講應用程序包中文件,這里面的資源文件以及可執(zhí)行文件是程序工程開發(fā)時產生的,。它基本上包含了:         

         1. .pch:預編譯頭文件,,win32里經常會碰到,這里也有,,包含了常用的頭文件,。

         2. .plist:包含了項目自身的特性,比如說項目名稱,,默認加載的nib file,,版本等。
         3..xib:程序的資源文件,。用于簡化編碼過程,提高開發(fā)效率,。
         4. main.m:iOS應用程序的入口,,類似于C/C++中的main函數。
         
          到了這里,,基本就可以開始應用程序具體的啟動過程了,。
         在main.m文件中,
  1. <span style="font-size:14px;">int main(int argc, char *argv[]) {  
  2.     NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];  
  3.     <strong>int retVal = UIApplicationMain(argc, argv, nil, nil);</strong>  
  4.     [pool release];  
  5.     return retVal;  
  6. }  
  7. </span>  

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對象,,即程序啟動時候的顯示窗口。

具體的代碼為:

  1. <span style="font-size:14px;">- (void)applicationDidFinishLaunching:(UIApplication *)application {  
  2.   
  3.     // Override point for customization after app launch  
  4.     [window addSubview:UIViewControllerInstance.view];  
  5.     [window makeKeyAndVisible];  
  6. }  
  7. </span>  
[window addSubview:UIViewControllerInstance.view] 表示 在調用[window makeKeyAndVisible] 是顯示UIViewControllerInstance的View,。

綜上所述,,程序啟動的流程為:


講到這里,如果沒有版本的更新問題,,其實是可以結束了,。而在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:

  1. NSString* documentsDirectory = [NSHomeDirectory()  
  2.         stringByAppendingPathComponent:@"Documents"];  
方法2:
  1. NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES);  
  2. NSString *documentsDirectory = [paths objectAtIndex:0];  
采用上面的方法你可以訪問Home目錄下的其他文件。同時iOS還提供了一些常用的搜索路徑常量:

常量

目錄

NSDocumentDirectory

<Application_Home>/Documents

NSCachesDirectory

<Application_Home>/Library/Caches

NSApplicationSupportDirectory

<Application_Home>/Library/Application Support




    本站是提供個人知識管理的網絡存儲空間,,所有內容均由用戶發(fā)布,,不代表本站觀點。請注意甄別內容中的聯(lián)系方式,、誘導購買等信息,,謹防詐騙。如發(fā)現(xiàn)有害或侵權內容,,請點擊一鍵舉報,。
    轉藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多