iOS 沙盒機制

沙盒機制

出于安全考慮,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)存。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容