前言:
處于安全考慮,iOS系統(tǒng)的沙盒機制規(guī)定每個應用都只能訪問當前沙盒目錄下面的文件(也有例外,比如在用戶授權情況下訪問通訊錄,相冊等),這個規(guī)則展示了iOS系統(tǒng)的封閉性。在開發(fā)中常常需要數(shù)據(jù)存儲的功能,比如存取文件,歸檔解檔等。
一、沙盒目錄結(jié)構(gòu)
每個APP的沙盒下面都有相似目錄結(jié)構(gòu),如圖(蘋果官方文檔):

Every App Is an Island

NSString *path = NSHomeDirectory();
上面的代碼得到的是應用程序目錄的路徑,在該目錄下有三個文件夾:Documents、Library、temp以及一個.app包!該目錄下就是應用程序的沙盒,應用程序只能訪問該目錄下的文件夾!??!
1、Documents 目錄:您應該將所有的應用程序數(shù)據(jù)文件寫入到這個目錄下。這個目錄用于存儲用戶數(shù)據(jù)。該路徑可通過配置實現(xiàn)iTunes共享文件??杀籭Tunes備份。
2、AppName.app 目錄:這是應用程序的程序包目錄,包含應用程序的本身。由于應用程序必須經(jīng)過簽名,所以您在運行時不能對這個目錄中的內(nèi)容進行修改,否則可能會使應用程序無法啟動。
3、Library 目錄:這個目錄下有兩個子目錄:
Preferences 目錄:包含應用程序的偏好設置文件。您不應該直接創(chuàng)建偏好設置文件,而是應該使用NSUserDefaults類來取得和設置應用程序的偏好.
Caches 目錄:用于存放應用程序?qū)S玫闹С治募4鎽贸绦蛟俅螁舆^程中需要的信息。
可創(chuàng)建子文件夾??梢杂脕矸胖媚M粋浞莸幌M挥脩艨吹降臄?shù)據(jù)。該路徑下的文件夾,除Caches以外,都會被iTunes備份。
4、tmp 目錄:這個目錄用于存放臨時文件,保存應用程序再次啟動過程中不需要的信息。該路徑下的文件不會被iTunes備份。
iTunes在與iPhone同步時,備份所有的Documents和Library文件。
iPhone在重啟時,會丟棄所有的tmp文件。
二、獲取各種文件目錄的路徑
獲取目錄路徑的方法:
// 獲取沙盒主目錄路徑NSString*homeDir =NSHomeDirectory();// 獲取Documents目錄路徑NSString*docDir = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES) firstObject];// 獲取Library的目錄路徑NSString*libDir = [NSSearchPathForDirectoriesInDomains(NSLibraryDirectory,NSUserDomainMask,YES) lastObject];// 獲取Caches目錄路徑NSString*cachesDir = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory,NSUserDomainMask,YES) firstObject];// 獲取tmp目錄路徑NSString*tmpDir =NSTemporaryDirectory();
獲取應用程序程序包中資源文件路徑的方法:
NSLog(@"%@",[[NSBundlemainBundle] bundlePath]);NSString*imagePath = [[NSBundlemainBundle] pathForResource:@"apple"ofType:@"png"];UIImage*appleImage = [[UIImagealloc] initWithContentsOfFile:imagePath];
三、NSSearchPathForDirectoriesInDomains
NSSearchPathForDirectoriesInDomains方法用于查找目錄,返回指定范圍內(nèi)的指定名稱的目錄的路徑集合。有三個參數(shù):
directoryNSSearchPathDirectory類型的enum值,表明我們要搜索的目錄名稱,比如這里用NSDocumentDirectory表明我們要搜索的是Documents目錄。如果我們將其換成NSCachesDirectory就表示我們搜索的是Library/Caches目錄。
domainMaskNSSearchPathDomainMask類型的enum值,指定搜索范圍,這里的NSUserDomainMask表示搜索的范圍限制于當前應用的沙盒目錄。還可以寫成NSLocalDomainMask(表示/Library)、NSNetworkDomainMask(表示/Network)等。
expandTildeBOOL值,表示是否展開波浪線~。我們知道在iOS中~的全寫形式是/User/userName,該值為YES即表示寫成全寫形式,為NO就表示直接寫成“~”。
該值為NO:Caches目錄路徑~/Library/Caches
該值為YES:Caches目錄路徑
/var/mobile/Containers/Data/Application/E7B438D4-0AB3-49D0-9C2C-B84AF67C752B/Library/Caches
iOS開發(fā)基礎-數(shù)據(jù)存儲方式(歸檔) - 簡書
— 前言:iOS開發(fā)中常常需要做一些數(shù)據(jù)讀取,歸檔可以直接將對象儲存成文件,解檔直接把文件讀取成對象,相對于plist或者userdefault形式,歸檔可以存儲的數(shù)據(jù)類型更加多樣,并且可以存取自定義對象。對象歸檔的文件是保密的,在磁盤上無法查看文件中的內(nèi)容,更加安全。一、系統(tǒng)對象的歸檔兩個核心方法+(BOOL)archiveRootObject:(id)rootObjecttoFile:(NSString)path;+(nullableid)unarchiveObjectWithFile:(NSString
文/小木___Boy(簡書作者)
原文鏈接:http://www.itdecent.cn/p/dd3f120eb249
著作權歸作者所有,轉(zhuǎn)載請聯(lián)系作者獲得授權,并標注“簡書作者”。