在模拟器中運作iOS程式,都會為該程式建立一個沙盒(SandBox)。
路徑查找:
點選桌面-->前往--->按住Option健+資源庫--->Application Support --->iPhone Simulator--->選擇相應系統型号;
上圖中的目錄結構類似于實際的iOS裝置中的目錄結構。
可以看到有兩個檔案夾,檔案夾的名字很複雜。這兩個檔案夾就可以看成是現在安裝在7.1模拟器中的兩個程式。它們的名稱是在Xcode中運作是自動建立的,名稱是随機産生的全局唯一辨別符。這裡展開其中第二個檔案夾。它就是上篇文章小例子運作時産生的:
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIiclRnblN0LclHdpZXYyd2LcBzNvwVZ2x2bzNXak9CX90TQNNkRrFlQKBTSvwFbslmZvwFMwQzLcVmepNHdu9mZvwFVywUNMZTY18CX052bm9CX90TQPRzYq5EejpWT4FEVkZXUYpVd1kmYr50MZV3YyI2cKJDT29GRjBjUIF2LcRHelR3LcJzLctmch1mclRXY39TN0YTMzUTM4EjNwMDM1EDMy8CX0Vmbu4GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
如上圖所示,程式中包含三個檔案夾: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程式讀寫的。打開它,可以看到我們上次做的設定是儲存在這個檔案中的:
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目錄。