什么是沙盒機制?
我們手中的iphone/ipad設備上包含著閃存(flash memory),它的功能和一個硬盤功能等價。當設備斷電后數(shù)據(jù)依然能夠被保存下來,應用程序可以把數(shù)據(jù)文件保存到閃存上,并且讀取它們。
但是,需要注意的是,我們所開發(fā)的應用程序是無法訪問整個閃存的,因為閃存上面會專門有一部分給我們,這一部分就是屬于我們開發(fā)的整個應用程序的沙盒(sandbox)了。
iOS系統(tǒng)下,每個應用都只能看到自己的沙盒,這就防止對其他應用程序的數(shù)據(jù)文件進行讀寫活動。就像我們的應用程序也能夠看見一些系統(tǒng)擁有的高級別目錄,但是卻無法進行任何的寫入操作。
沙盒目錄:
AppName.app目錄:這是應用程序的程序包目錄,包含應用程序的本身。由于應用程序必須經(jīng)過簽名,所以您在運行時不能對這個目錄中的內(nèi)容進行修改,否則可能會使應用程序無法啟動。
Documents目錄:應用會將數(shù)據(jù)存儲在這個文件夾里,但是基于NSUserDefaults 的首選項設置除外;
Library目錄:基于NSUserDefaults的首選項設置存儲在 Library/Preferences 文件夾中,且Library下面有Preferences和Caches目錄;
tmp目錄:供應用存儲臨時文件,當iOS設備進行同步操作時,iTunes并不會備份這個文件夾的文件,但是在不需要這些文件的時候,應用需要刪除tmp中的這些文件,以免占用文件系統(tǒng)空間;
Documents目錄
由于iOS中應用的數(shù)據(jù)存儲是沙盒機制,因此讀取和寫入文件,我們需要調(diào)用C函數(shù) “NSSearchPathForDirectoriesInDomains()”來查找各種目錄,(這個C函數(shù)可以基于Mac OS X平臺的Cocoa共享)
如檢索Documents目錄路徑的代碼:
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *pathDirectory = [paths objectAtIndex:0];
第一個常量NSDocumentDirectory表示我們正在查找目錄的路徑,
第二個常量NSUserDomainMask表明我們希望將搜索限制在應用的沙盒內(nèi);(在Mac OS X中,此常量表示我們希望該函數(shù)查看用戶的主目錄,因此才會有這個命名;)
返回的paths是一個數(shù)組,為什么位于索引0就是我們需要的Documents目錄?因為每一個應用只有一個Documents目錄,因此只有一個目錄符合這個條件;接下來,我們可以為剛才檢索到的目錄pathDirectory的結(jié)尾加一個字符串來創(chuàng)建一個文件名,如下:
//注意是stringByAppendingPathComponent,不要拼錯。
NSString *filename = [pathDirectory stringByAppendingPathComponent:@"data.txt"];
這個時候我們得到的filename字符串就可以進行創(chuàng)建、讀取、寫入文件了。
Library目錄:
這個目錄下有兩個子目錄:
Preferences 目錄:包含應用程序的偏好設置文件。您不應該直接創(chuàng)建偏好設置文件,而是應該使用NSUserDefaults類來取得和設置應用程序的偏好.iOS的Settings(設置)應用會在該目錄中查找應用的設置信息。iTunes同步設備時會備份該目錄。
Caches 目錄:用于存放應用程序?qū)S玫闹С治募4鎽贸绦蛟俅螁舆^程中需要的信息。可創(chuàng)建子文件夾。可以用來放置您希望被備份但不希望被用戶看到的數(shù)據(jù)。該路徑下的文件夾,除Caches以外,都會被iTunes備份。
1.獲取Library的目錄路徑
NSString *libDir = [NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES) lastObject];
2.獲取Caches目錄路徑
NSString *cachesDir = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) firstObject];
tmp目錄:
可以用NSTemporaryDirectory()的Foundation函數(shù)返回一個字符串,該字符串包含到應用臨時目錄的完整路徑。 同上,在結(jié)尾附上文件名就可以創(chuàng)建指向該目錄下的文件路徑了。
NSString *tmpPath = NSTemporaryDirectory();
NSString *temFile = [tmpPath stringByAppendingPathComponent:@"tempFile.txt"];
AppName.app目錄
獲取應用程序程序包中資源,如:獲取本地txt文件中的內(nèi)容
NSString *path = [[NSBundle mainBundle] pathForResource:@"data" ofType:@"txt"];
NSString *data = [[NSString alloc] initWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil];