? ? ? 在項目中我們難免會用到一些緩存方式來保存服務器傳過來的數(shù)據(jù),以減少服務器的壓力笨忌。 緩存的方式分為兩種分別為內存緩存和磁盤緩存,內存緩存速度快容量小,磁盤緩存(沙盒)容量大速度慢可持久化凰浮。
現(xiàn)將參考的文章列出來 ?內存緩存和磁盤緩存??SDWebImage緩存策略
????緩存分為內存緩存和磁盤緩存兩種,其中內存是指當前程序的運行空間苇本,緩存速度快容量小袜茧,是臨時存儲文件用的,供CPU直接讀取瓣窄,比如說打開一個程序,他是在內存中存儲,關閉程序后內存就又回到原來的空閑空間笛厦;磁盤是程序的存儲空間,緩存容量大速度慢可持久化與內存不同的是磁盤是永久存儲東西的俺夕,只要里面存放東西,不管運行不運行 裳凸,他都占用空間!磁盤緩存是存在Library/Caches劝贸。
一 ?內存緩存
iOS內存分為5個區(qū):棧區(qū)登舞,堆區(qū),全局區(qū)悬荣,常量區(qū)菠秒,代碼區(qū)
棧區(qū)stack:這一塊區(qū)域系統(tǒng)會自己管理,我們不用干預,主要存一些局部變量践叠,以及函數(shù)跳轉時的現(xiàn)場保護言缤。因此大量的局部變量,深遞歸,函數(shù)循環(huán)調用都可能導致內存耗盡而運行崩潰禁灼。
堆區(qū)heap:與棧區(qū)相對管挟,這一塊一般由我們自己管理,比如alloc弄捕,free的操作僻孝,存儲一些自己創(chuàng)建的對象。
全局區(qū)(靜態(tài)區(qū)static):全局變量和靜態(tài)變量都存儲在這里守谓,已經(jīng)初始化的和沒有初始化的會分開存儲在相鄰的區(qū)域穿铆,程序結束后系統(tǒng)會釋放
常量區(qū):存儲常量字符串和const常量
代碼區(qū):存儲代碼
代碼區(qū)為低地址->棧區(qū)為高地址?
二 磁盤緩存
? ? iOS應用程序只能在該程序創(chuàng)建的文件系統(tǒng)中讀取文件,不可以去其它地方訪問斋荞,此區(qū)域被成為沙盒荞雏,所以所有的非代碼文件都要保存在此,例如圖像平酿,圖標凤优,聲音,映像蜈彼,屬性列表筑辨,文本文件等
默認情況下,每個沙盒含有3個文件夾:Documents, Library?和?tmp幸逆。
?Documents:蘋果建議將程序中建立的或在程序中瀏覽到的文件數(shù)據(jù)保存在該目錄下棍辕,iTunes備份和恢復的時候會包括此目錄
? ? ? ? Library:存儲程序的默認設置或其它狀態(tài)信息;
? ? ? ? Library/Caches:存放緩存文件秉颗,iTunes不會備份此目錄痢毒,此目錄下文件不會在應用退出刪除.
? ? ? ? Library/preferences: 存放的是?user default 存儲的信息,iTunes會備份此目錄蚕甥,?應用程序重新啟動不會丟棄數(shù)據(jù)哪替,我們使用 NSUserDefaults寫的設置數(shù)據(jù)都會保存到該目錄下的一個plist文件中,這就是所謂的寫到plist中菇怀!
? ? ? ? tmp:提供一個即時創(chuàng)建臨時文件的地方凭舶,?iTunes不會備份此目錄
????用戶生成的文件放在documents,自己的文件放在library/cache里面爱沟,簡單的說明:如果你做個記事本的app帅霜,那么用戶寫了東西,總要把東西存起來呼伸。那么這個文件則是用戶自行生成的身冀,就放在documents文件夾里面钝尸。如果你有一個app,需要和服務器配合搂根,經(jīng)常從服務器下載東西珍促,展示給用戶看。那么這些下載下來的東西就放在library/cache剩愧。apple對這個很嚴格猪叙,放錯了就會被拒。主要原因是ios的icloud的同步問題仁卷。
三 應用
????SDWebImage使用NSCache類來實現(xiàn)內存緩存穴翩。
? ? 在加載圖片的時候,SDWebImage調用SDImageCache先讀取內存緩存锦积,如果內存緩存沒有芒帕,就會使用GCD開啟異步線程去讀取磁盤緩存,如果找到磁盤緩存充包,則同步到內存緩存中去副签,使用GCD在主線程中設置圖片遥椿,如果都沒有基矮,下載后會緩存到內存和磁盤上(可選)。
? ??SDWebImage 默認會有一個對上次加載失敗的圖片拒絕再次加載的機制冠场。 也就是說家浇,一張圖片在本次會話加載失敗了,如果再次加載就會直接拒絕碴裙。(額外知識)
????SDWebImage 會在每次 APP 結束的時候執(zhí)行清理任務钢悲。 清理緩存的規(guī)則分兩步進行。 第一步先清除掉過期的緩存文件舔株。 如果清除掉過期的緩存之后莺琳,空間還不夠。 那么就繼續(xù)按文件時間從早到晚排序载慈,先清除最早的緩存文件惭等,直到剩余空間達到要求。具體點办铡,SDWebImage 是怎么控制哪些緩存過期辞做,以及剩余空間多少才夠呢?maxCacheAge是文件緩存的時長,maxCacheAge 的默認值寡具,注釋上寫的很清楚秤茅,緩存一周,SDWebImage 在默認情況下不會對緩存空間maxCacheSize設限制。分別在應用進入后臺和結束的時候童叠,遍歷所有的緩存文件框喳,如果緩存文件超過 maxCacheAge 中指定的時長,就會被刪除掉。(額外知識)
[SDImageCache sharedImageCache].maxCacheSize =?1024?*?1024?*?50;// 50M
maxCacheSize 是以字節(jié)來表示的五垮,我們上面的計算代表 50M 的最大緩存空間撰豺。 把這行代碼寫在你的 APP 啟動的時候,這樣 SDWebImage 在清理緩存的時候拼余,就會清理多余的緩存文件了恕刘。(額外知識)
常見的內存緩存有NSCache、TMMemoryCache象迎、PINMemoryCache揽趾、YYMemoryCache。常見的磁盤緩框架存有TMDiskCache亭姥、PINDiskCache稼钩、YYCache。