應(yīng)用程序沙盒
iOS應(yīng)用程序只能在系統(tǒng)為該應(yīng)用所分配的文件區(qū)域下讀/寫(xiě)文件,這個(gè)文件區(qū)域就是沙盒.
沙盒機(jī)制:一種安全機(jī)制,保證每個(gè)應(yīng)用程序只能訪問(wèn)本沙盒內(nèi)的數(shù)據(jù),避免與其他應(yīng)用發(fā)生沖突.
查看沙盒:Finder :shift + comand+ g快速到指定路徑(獲取方法_通過(guò)xcode打印NSHomeDirectory())
示例路徑:/Users/用戶名/Library/Developer/CoreSimulator/Devices/7413FCDA-8FD4-49C1-A16C-05E361A68707/data/Containers/Data/Application/18AF754B-F8F3-4DF7-9035-C48C5671BFAB
文件結(jié)構(gòu):
相關(guān)路徑獲取方法
沙盒路徑
NSString *NSHomeDirectory(void);
Documents目錄
保存應(yīng)用程序的數(shù)據(jù),文件.
一般:數(shù)據(jù)庫(kù)文件,一些常用文件(writeTofile:),網(wǎng)絡(luò)下載的文件等等
NSSearchPathForDirectoriesInDomains返回的是符合條件的所有目錄,Mac不太了解,可以看出,這個(gè)方法最初是為Mac OS 設(shè)計(jì)的,Mac OS中NSUserDomainMask代表查看當(dāng)前用戶的Home目錄,而iOS下只有一個(gè)對(duì)應(yīng)的目錄,直接取第一個(gè)元素或者最后一個(gè)元素即可.第一個(gè)參數(shù)傳入需要查找的文件夾Documens,第二個(gè)參數(shù)NSUserDomainMask代表僅搜索應(yīng)用程序沙盒.
NSString *documentsDirectory(){
return NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).firstObject;
}
Tep目錄
該目錄供應(yīng)用程序存儲(chǔ)臨時(shí)文件,當(dāng)iOS執(zhí)行同步時(shí),iTunes 不會(huì)備份tmp目錄下的文件,因此當(dāng)應(yīng)用程序不再需要某個(gè)臨時(shí)文件時(shí),應(yīng)該負(fù)責(zé)刪除tmp目錄下的臨時(shí)文件,避免占用系統(tǒng)空間.
NSTemporaryDirectory();
Library
一般Library/Caches存儲(chǔ)緩存數(shù)據(jù)(NSCache),比如SDWebimage是將圖片存在該文件下.
Library/Preferences存儲(chǔ)用戶偏好設(shè)置,即通過(guò)NSUserDefault存儲(chǔ)的數(shù)據(jù),會(huì)建立一個(gè)以Bundle identifier.plist命名的文件,在該目錄下.
//Libary
NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES).firstObject;
//Caches
NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES).firstObject;
文件保存
單文件保存:
對(duì)于NSArray,NSDictionary 可以通過(guò)writeToFile:atomically寫(xiě)入單個(gè)文件,通過(guò)arrayWithContentsOfFile:或者dictionaryWithContentsOfFile:讀取集合中的內(nèi)容.簡(jiǎn)單易用,但是每次讀取文件內(nèi)容總是一次性加載全部文件內(nèi)容,可能會(huì)導(dǎo)致內(nèi)存緊張,即使改動(dòng)很小的一部分內(nèi)容,也需要全部重新寫(xiě)入文件.
所以,如果應(yīng)用程序需要保存,讀取的數(shù)據(jù)量不大,可以使用NSArray,NSDictionary來(lái)保存,讀取程序數(shù)據(jù).
多文件保存:
可用于保存多個(gè)相互關(guān)聯(lián)性較小的文件內(nèi)容.可以避免一次性加載,修改需要全部寫(xiě)入.但是文件過(guò)多會(huì)容易混亂,需要建立額外的數(shù)據(jù)結(jié)構(gòu)去管理文件和內(nèi)容之間的關(guān)系.
少量數(shù)據(jù),可以采用NSUserdefault或者單文件存儲(chǔ),當(dāng)遇到大量數(shù)據(jù)存儲(chǔ)時(shí),我們需要借助SQLite3或者Core Date來(lái)管理數(shù)據(jù).