什么是沙盒機(jī)制晤柄?
我們手中的iphone/ipad設(shè)備上包含著閃存(flash memory)傍念,它的功能和一個(gè)硬盤功能等價(jià)围辙。當(dāng)設(shè)備斷電后數(shù)據(jù)依然能夠被保存下來吉捶,應(yīng)用程序可以把數(shù)據(jù)文件保存到閃存上夺鲜,并且讀取它們皆尔。
但是,需要注意的是币励,我們所開發(fā)的應(yīng)用程序是無法訪問整個(gè)閃存的慷蠕,因?yàn)殚W存上面會(huì)專門有一部分給我們,這一部分就是屬于我們開發(fā)的整個(gè)應(yīng)用程序的沙盒(sandbox)了食呻。
iOS系統(tǒng)下流炕,每個(gè)應(yīng)用都只能看到自己的沙盒,這就防止對(duì)其他應(yīng)用程序的數(shù)據(jù)文件進(jìn)行讀寫活動(dòng)仅胞。就像我們的應(yīng)用程序也能夠看見一些系統(tǒng)擁有的高級(jí)別目錄每辟,但是卻無法進(jìn)行任何的寫入操作。
沙盒目錄:
AppName.app目錄:這是應(yīng)用程序的程序包目錄干旧,包含應(yīng)用程序的本身渠欺。由于應(yīng)用程序必須經(jīng)過簽名,所以您在運(yùn)行時(shí)不能對(duì)這個(gè)目錄中的內(nèi)容進(jìn)行修改椎眯,否則可能會(huì)使應(yīng)用程序無法啟動(dòng)挠将。
Documents目錄:應(yīng)用會(huì)將數(shù)據(jù)存儲(chǔ)在這個(gè)文件夾里,但是基于NSUserDefaults 的首選項(xiàng)設(shè)置除外编整;
Library目錄:基于NSUserDefaults的首選項(xiàng)設(shè)置存儲(chǔ)在 Library/Preferences 文件夾中舔稀,且Library下面有Preferences和Caches目錄;
tmp目錄:供應(yīng)用存儲(chǔ)臨時(shí)文件闹击,當(dāng)iOS設(shè)備進(jìn)行同步操作時(shí)镶蹋,iTunes并不會(huì)備份這個(gè)文件夾的文件,但是在不需要這些文件的時(shí)候赏半,應(yīng)用需要?jiǎng)h除tmp中的這些文件贺归,以免占用文件系統(tǒng)空間;
Documents目錄
由于iOS中應(yīng)用的數(shù)據(jù)存儲(chǔ)是沙盒機(jī)制断箫,因此讀取和寫入文件拂酣,我們需要調(diào)用C函數(shù) “NSSearchPathForDirectoriesInDomains()”來查找各種目錄,(這個(gè)C函數(shù)可以基于Mac OS X平臺(tái)的Cocoa共享)
如檢索Documents目錄路徑的代碼:
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *pathDirectory = [paths objectAtIndex:0];
第一個(gè)常量NSDocumentDirectory表示我們正在查找目錄的路徑仲义,
第二個(gè)常量NSUserDomainMask表明我們希望將搜索限制在應(yīng)用的沙盒內(nèi)婶熬;(在Mac OS X中,此常量表示我們希望該函數(shù)查看用戶的主目錄埃撵,因此才會(huì)有這個(gè)命名赵颅;)
返回的paths是一個(gè)數(shù)組,為什么位于索引0就是我們需要的Documents目錄暂刘?因?yàn)槊恳粋€(gè)應(yīng)用只有一個(gè)Documents目錄饺谬,因此只有一個(gè)目錄符合這個(gè)條件;接下來谣拣,我們可以為剛才檢索到的目錄pathDirectory的結(jié)尾加一個(gè)字符串來創(chuàng)建一個(gè)文件名募寨,如下:
//注意是stringByAppendingPathComponent族展,不要拼錯(cuò)。
NSString *filename = [pathDirectory stringByAppendingPathComponent:@"data.txt"];
這個(gè)時(shí)候我們得到的filename字符串就可以進(jìn)行創(chuàng)建拔鹰、讀取仪缸、寫入文件了。
Library目錄:
這個(gè)目錄下有兩個(gè)子目錄:
Preferences 目錄:包含應(yīng)用程序的偏好設(shè)置文件列肢。您不應(yīng)該直接創(chuàng)建偏好設(shè)置文件恰画,而是應(yīng)該使用NSUserDefaults類來取得和設(shè)置應(yīng)用程序的偏好.iOS的Settings(設(shè)置)應(yīng)用會(huì)在該目錄中查找應(yīng)用的設(shè)置信息。iTunes同步設(shè)備時(shí)會(huì)備份該目錄例书。
Caches 目錄:用于存放應(yīng)用程序?qū)S玫闹С治募辔荆4鎽?yīng)用程序再次啟動(dòng)過程中需要的信息【霾桑可創(chuàng)建子文件夾》匕拢可以用來放置您希望被備份但不希望被用戶看到的數(shù)據(jù)树瞭。該路徑下的文件夾,除Caches以外爱谁,都會(huì)被iTunes備份晒喷。
1.獲取Library的目錄路徑
NSString *libDir = [NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES) lastObject];
2.獲取Caches目錄路徑
NSString *cachesDir = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) firstObject];
tmp目錄:
可以用NSTemporaryDirectory()的Foundation函數(shù)返回一個(gè)字符串,該字符串包含到應(yīng)用臨時(shí)目錄的完整路徑访敌。 同上凉敲,在結(jié)尾附上文件名就可以創(chuàng)建指向該目錄下的文件路徑了。
NSString *tmpPath = NSTemporaryDirectory();
NSString *temFile = [tmpPath stringByAppendingPathComponent:@"tempFile.txt"];
AppName.app目錄
獲取應(yīng)用程序程序包中資源寺旺,如:獲取本地txt文件中的內(nèi)容
NSString *path = [[NSBundle mainBundle] pathForResource:@"data" ofType:@"txt"];
NSString *data = [[NSString alloc] initWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil];