天天看點

iOS開發應用程式的沙盒(SandBox)結構

在模拟器中運作iOS程式,都會為該程式建立一個沙盒(SandBox)。

路徑查找:

點選桌面-->前往--->按住Option健+資源庫--->Application Support --->iPhone Simulator--->選擇相應系統型号;

上圖中的目錄結構類似于實際的iOS裝置中的目錄結構。

可以看到有兩個檔案夾,檔案夾的名字很複雜。這兩個檔案夾就可以看成是現在安裝在7.1模拟器中的兩個程式。它們的名稱是在Xcode中運作是自動建立的,名稱是随機産生的全局唯一辨別符。這裡展開其中第二個檔案夾。它就是上篇文章小例子運作時産生的:

iOS開發應用程式的沙盒(SandBox)結構

如上圖所示,程式中包含三個檔案夾:Documents、Library和tmp。

1、Documents:

這個目錄用于存放程式中的資料,除了那些基于NSUserDefaults的設定資料。

擷取程式的Documents目錄的代碼是:

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];      

NSUserDefaults的使用:

建立一個user defaults方法有多個,最簡單得快速建立方法:

   NSUserDefaults *accountDefaults = [NSUserDefaults standardUserDefaults];

添加資料到 user defaults:

   [accountDefaults setObject:nameField.text forKey:UserDefaultNameKey];

也可以添加基本資料類型int, float, bool等,有相應得方法

   [accountDefaults setBool:YES forKey:UserDefaultBoolKey];

從user defaults中擷取資料:

   [accountDefaults objectForKey:NCUserDefaultNameKey]   //存取字元類型

   [accountDefaults boolForKey: UserDefaultBoolKey];   //存取bool類型

則documentsDirectory中存儲的就是Documents目錄的位址。

2、Library:

這個目錄包含兩個子目錄:Caches與Preferences。

Preferences這個目錄存放的是基于NSUserDefaults的設定資料,例如上圖中可以看到一個plist檔案,它就是我們上次進行的設定項,是Settings程式讀寫的。打開它,可以看到我們上次做的設定是儲存在這個檔案中的:

iOS開發應用程式的沙盒(SandBox)結構

2.1 擷取Library目錄位址的代碼與Documents類似:

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES);
NSString *libraryDirectory = [paths objectAtIndex:0];      

2.2 擷取Caches目錄位址:

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
NSString* cachesDirectory = [paths objectAtIndex:0];      

3、tmp:

我們可以在這個目錄下存放臨時檔案,當裝置接到iTunes時,tmp中的資料會進行同步。我們的程式應當要負責删除tmp目錄下的内容。

擷取tmp目錄:

我看很多資料上寫的擷取tmp目錄的方法是:

NSString *tempPath = NSTemporaryDirectory();      

 但是我發現獲得的卻不是程式的tmp目錄,而是:

/var/folders/tp/pl9mdxtx199bs8_k29n89ff80000gn/T/      

 貌似也沒有一個像NSLibraryDirectory那樣的參數可以直接用來擷取這個目錄。

不過,如果我們可以獲得這個程式的根目錄,就可以擷取tmp目錄了:

//擷取程式的根目錄
NSString *homeDirectory = NSHomeDirectory();
//擷取tmp目錄的位址
NSString *tmpDirectory = [homeDirectory stringByAppendingPathComponent:@"tmp"];      

 tmpDirectory中存儲的就是本程式的tmp目錄。

我使用FileManager向其中建立子目錄和檔案時都可以執行,不過我有個程式試圖用FTP向其中下載下傳檔案,卻出現了檔案寫入錯誤。

擷取了上述目錄位址後,想要獲得其中的檔案或者子目錄,隻要:

NSString *filename = [documentsDirectory stringByAppendingPathComponent:@"filename.txt"];      

在真機上,NSTemporaryDirectory對應的就是app目錄的tmp目錄。

繼續閱讀