沙盒機制
出于安全考慮,iPhone對于安裝在上面的應用程序有所限制,這個限制就是應用程序只能在為該改程序創(chuàng)建的文件系統(tǒng)中讀取文件,不可以去其它地方訪問,此區(qū)域被成為沙盒,所以所有的非代碼文件都要保存在此,例如圖像,圖標,聲音,映像,屬性列表,文本文件等??傮w來說沙盒就是一種獨立、安全、封閉的空間。
沙盒機制的特點
- 每個應用程序都有自己的存儲空間。
- 每個應用程序都不可以翻過自己的圍墻去訪問別的存儲空間的內(nèi)容。(已經(jīng)越獄的除外)
- 在訪問別人沙盒內(nèi)的數(shù)據(jù)時需要訪問權(quán)限。
模擬圖
沙盒(sandbox)的核心內(nèi)容是:sandbox對應用程序執(zhí)行各種操作的權(quán)限限制
獲取系統(tǒng)目錄下的文件路徑
應用程序的沙盒目錄
應用程序沙盒目錄下有三個文件夾Documents、Library(下面有Caches和Preferences目錄)、tmp。
- Documents:保存應用運行時生成的需要持久化的數(shù)據(jù)iTunes會自動備份該目錄。蘋果建議將在應用程序中瀏覽到的文件數(shù)據(jù)保存在該目錄下。
- Library/Caches:一般存儲的是緩存文件,例如圖片視頻等,此目錄下的文件不會再應用程序退出時刪除,在手機備份的時候,iTunes不會備份該目錄。
- Library/Preferences:保存應用程序的所有偏好設(shè)置iOS的Settings(設(shè)置),我們不應該直接在這里創(chuàng)建文件,而是需要通過NSUserDefault這個類來訪問應用程序的偏好設(shè)置。iTunes會自動備份該文件目錄下的內(nèi)容。
- tmp:臨時文件目錄,在程序重新運行的時候,和開機的時候,會清空tmp文件夾。
獲取文件路徑
- 獲取Documents文件路徑
/**
* 獲取Document下的文件路徑
*
* @param NSDocumentDirectory 獲取Document目錄
* @param NSUserDomainMask 是在當前沙盒范圍內(nèi)查找
* @param YES 展開路徑,NO是不展開
*
* @return test.txt文件的路徑
*/
NSString *filePath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,
NSUserDomainMask, YES)firstObject]stringByAppendingPathComponent:@"test.txt"];
- 獲取Library文件路徑
/**
* 獲取Library目錄下文件路徑
*
* @param NSLibraryDirectory 獲取Library目錄
* @param NSUserDomainMask 在當前的沙盒范圍內(nèi)查找
* @param YES 展開路徑,NO不展開路徑
*
* @return test.txt文件的路徑
*/
NSString *filePath = [[NSSearchPathForDirectoriesInDomains(NSLibraryDirectory,
NSUserDomainMask, YES)firstObject]stringByAppendingPathComponent:@"test.txt"];
- 獲取Library/Caches文件目錄
/**
* 獲取Library目錄下文件路徑
*
* @param NSCachesDirectory 獲取Library/Caches目錄
* @param NSUserDomainMask 在當前的沙盒范圍內(nèi)查找
* @param YES 展開路徑,NO不展開路徑
*
* @return test.txt文件的路徑
*/
NSString *filePath = [[NSSearchPathForDirectoriesInDomains(NSCachesDirectory,
NSUserDomainMask, YES)firstObject]stringByAppendingPathComponent:@"test.txt"];
- 獲取Library/Preferences,Preferences由系統(tǒng)維護,不需要我們手動的獲取文件路徑進行操作,而是需要借助NSUserDefault來操作,但是我們是可以獲取到這個文件的。
/**
* 獲取Library目錄下文件路徑
*
* @param NSLibraryDirectory 獲取Library目錄
* @param NSUserDomainMask 在當前的沙盒范圍內(nèi)查找
* @param YES 展開路徑,NO不展開路徑
*
* @return Preferences文件的路徑
*/
NSString *filePath = [[NSSearchPathForDirectoriesInDomains(NSLibraryDirectory,
NSUserDomainMask, YES)firstObject]stringByAppendingPathComponent:@"Preferences"];
- 獲取tmp文件路徑
/**
* 獲取tmp文件目錄下的文件路徑
*
* @return test.txt的文件路徑
*/
NSString *filePath = [NSTemporaryDirectory()stringByAppendingPathComponent:@"test.txt"];
代碼獲取應用程序包的目錄與內(nèi)容
- 獲取應用程序包的路徑
NSString *imagePath = [NSBundle mainBundle].resourcePath;
程序包文件,包含了資源文件和可執(zhí)行文件AppName.app
- 獲取程序包中一個圖片資源路徑的方法(apple.png)
NSString *imagePath = [[NSBundle mainBundle]pathForResource:@"apple" ofType:@"png"];
imageWithname這種加載的方式是有緩存的,第二次在加載時直接從內(nèi)存中取出圖片,這樣的話效率更高,但是會使得內(nèi)存變得越來越大,通常使用在,圖片內(nèi)存較小,而且需要頻繁使用的地方。NSBundle mainBundle 是通過獲取圖片的全路徑來加載圖片的,不會有緩存,但是這樣每次就得重新加載,它也不會是在不是在使用完圖片后就釋放,而是在下一次使用圖片的時候才會釋放,所以需要我們在使用完圖片后,手動來釋放內(nèi)存。
