出於安全考慮,iOS系統的沙盒機制規定每一個應用都只能訪問當前沙盒目錄下面的文件(也有例外,好比系統通信錄能在用戶受權的狀況下被第三方應用訪問),這個規則把iOS系統的封閉性展示的淋漓盡致。html
每一個應用的沙盒目錄都是類似的,主要包含圖中所示的4個目錄:
一、MyApp.app
①存放內容
該目錄包含了應用程序自己的數據,包括資源文件和可執行文件等。程序啓動之後,會根據須要從該目錄中動態加載代碼或資源到內存,這裏用到了lazy loading的思想。
②整個目錄是隻讀的
爲了防止被篡改,應用在安裝的時候會將該目錄簽名。非越獄狀況下,該目錄中內容是沒法更改的;在越獄設備上若是更改了目錄內容,對應的簽名就會被改變,這種狀況下蘋果官網描述的後果是應用程序將沒法啓動,我沒實踐過。
③是否會被iTunes同步
否
二、Documents
①存放內容
咱們能夠將應用程序的數據文件保存在該目錄下。不過這些數據類型僅限於不可再生的數據,可再生的數據文件應該存放在Library/Cache目錄下。
②是否會被iTunes同步
是
三、Documents/Inbox
①存放內容
該目錄用來保存由外部應用請求當前應用程序打開的文件。
好比咱們的應用叫A,向系統註冊了幾種可打開的文件格式,B應用有一個A支持的格式的文件F,而且申請調用A打開F。因爲F當前是在B應用的沙盒中,咱們知道,沙盒機制是不容許A訪問B沙盒中的文件,所以蘋果的解決方案是講F拷貝一份到A應用的Documents/Inbox目錄下,再讓A打開F。
②是否會被iTunes同步
是
四、Library
①存放內容
蘋果建議用來存放默認設置或其它狀態信息。
②是否會被iTunes同步
是,可是要除了Caches子目錄外
五、Library/Caches
①存放內容
主要是緩存文件,用戶使用過程當中緩存均可以保存在這個目錄中。前面說過,Documents目錄用於保存不可再生的文件,那麼這個目錄就用於保存那些可再生的文件,好比網絡請求的數據。鑑於此,應用程序一般還須要負責刪除這些文件。
②是否會被iTunes同步
否。
六、Library/Preferences
①存放內容
應用程序的偏好設置文件。咱們使用NSUserDefaults寫的設置數據都會保存到該目錄下的一個plist文件中,這就是所謂的寫道plist中!
②是否會被iTunes同步
是
七、tmp
①存放內容
各類臨時文件,保存應用再次啓動時不須要的文件。並且,當應用再也不須要這些文件時應該主動將其刪除,由於該目錄下的東西隨時有可能被系統清理掉,目前已知的一種可能清理的緣由是系統磁盤存儲空間不足的時候。
②是否會被iTunes同步
否
2、獲取主要目錄路徑的方式
一、沙盒目錄
NSLog(@"%@",NSHomeDirectory());
輸出結果:
/var/mobile/Applications/326640A7-6E27-4C63-BA5E-7391F203659A xcode
二、tmp
NSLog(@"%@",NSTemporaryDirectory());
輸出結果:緩存
/private/var/mobile/Applications/326640A7-6E27-4C63-BA5E-7391F203659A/tmp/安全
三、Myapp.app
NSLog(@"%@",[[NSBundle mainBundle] bundlePath]);
輸出結果:網絡
/var/mobile/Applications/326640A7-6E27-4C63-BA5E-7391F203659A/PhoneCall.app app
四、Documents
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *path = [paths objectAtIndex:0];
NSLog(@"%@",path);
輸出結果:dom
/var/mobile/Applications/326640A7-6E27-4C63-BA5E-7391F203659A/Documentside
這裏用到的NSSearchPathForDirectoriesInDomains方法須要解釋下,其聲明以下:ui
FOUNDATION_EXPORT NSArray *NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory directory, NSSearchPathDomainMask domainMask, BOOL expandTilde);
該方法用於返回指定範圍內的指定名稱的目錄的路徑集合。有三個參數:
NSSearchPathDirectory類型的enum值,代表咱們要搜索的目錄名稱,好比這裏用NSDocumentDirectory代表咱們要搜索的是Documents目錄。若是咱們將其換成NSCachesDirectory就表示咱們搜索的是Library/Caches目錄。
NSSearchPathDomainMask類型的enum值,指定搜索範圍,這裏的NSUserDomainMask表示搜索的範圍限制於當前應用的沙盒目錄。還能夠寫成NSLocalDomainMask(表示/Library)、NSNetworkDomainMask(表示/Network)等。
BOOL值,表示是否展開波浪線~。咱們知道在iOS中~的全寫形式是/User/userName,該值爲YES即表示寫成全寫形式,爲NO就表示直接寫成「~」。
3、參考文檔
一、蘋果官方文檔
https://developer.apple.com/library/mac/documentation/FileManagement/Conceptual/FileSystemProgrammingGuide/Introduction/Introduction.html#//apple_ref/doc/uid/TP40010672-CH1-SW1spa