原地址:http://www.itdecent.cn/p/205c1daa8535
前幾天,項(xiàng)目的功能基本完成差不多的時(shí)候。用allocation檢測了下內(nèi)存運(yùn)行狀況,發(fā)現(xiàn)當(dāng)tableView快速滾動,以及頁面不斷跳轉(zhuǎn)時(shí),cg-raster-data在不斷猛增,甚至達(dá)到了100M之多,并且當(dāng)我將app退回后臺時(shí),也僅僅只是稍微釋放了一點(diǎn)。
為什么當(dāng)加載停止后,內(nèi)存沒有下去呢。一開始認(rèn)為,可能因?yàn)閟dwebimage是會將圖片下載后放進(jìn)內(nèi)存中一直保存至收到內(nèi)存警告,或者主動清除才能釋放掉。于是我在離開加載圖片的頁面時(shí),做了清除緩存及disk的動作,但是仍舊沒用。所以問題不是出在這里。
[[SDImageCachesharedImageCache]clearMemory];
[[SDImageCachesharedImageCache]clearDisk];
然后我嘗試了下將sd的最大下載內(nèi)存占用設(shè)置了小一點(diǎn)。只要同一時(shí)間內(nèi),加載圖片而多出來的內(nèi)存不超過這個大小,是不是就會降低內(nèi)存消耗呢。于是,我用setMaxMemoryCost 方法設(shè)置了最大內(nèi)存。但是發(fā)現(xiàn)了另外個問題。因?yàn)閟dwebimage同時(shí)能保存到內(nèi)存的數(shù)量減少了,每次我下拉加載tableview時(shí),會去從網(wǎng)絡(luò)端不斷的重新加載圖片,導(dǎo)致頁面每次reload時(shí)會閃屏。肉眼能明顯的感覺的每次的閃動,用戶體驗(yàn)特別差。
之后,在一通google。發(fā)現(xiàn)一個別人的解決辦法,很好用,同時(shí)也確實(shí)解決了我的問題。sdwebimage在加載圖片的時(shí)候,默認(rèn)是shouldDecompressImages=Y(jié)ES.也就是框架作者本意是為了讓圖片加載更塊,所以會幫我把圖片解壓至內(nèi)存中,尤其圖片分辨率愈大,內(nèi)存消耗越大。需要將其關(guān)閉。
[[SDImageCache sharedImageCache] setShouldDecompressImages:NO];
[[SDWebImageDownloader sharedDownloader] setShouldDecompressImages:NO];
關(guān)閉后發(fā)現(xiàn),其實(shí)加載時(shí)候并沒有特別明顯的感覺加載速度變慢了。并且內(nèi)存消耗幾乎沒有。其實(shí)開發(fā)者也有在文件里寫明。只是平時(shí)很少有人會去看。
* Decompressing images that are downloaded and cached can improve peformance but can consume lot of memory.
* Defaults to YES. Set this to NO if you are experiencing a crash due to excessive memory consumption.