標籤:
iOS的記憶體管理始終是開發人員面臨的大問題,記憶體佔用過大時,很容易會被系統kill掉,開發人員需要儘可能的最佳化記憶體佔用問題。
現在的App介面做的越來越精緻,裡面整合了大量的圖片,筆者首先想到的就是如何減少這些圖片佔用的記憶體。
通常我們載入圖片使用以下方式: 1.imageNamed: 圖片載入完成後,系統會把它緩衝在記憶體中,當第二次載入時,直接就從記憶體中讀取了,好處是載入速度過,缺點就是會一直佔用系統記憶體,當我們的圖片需要反覆載入時,這種方式是一種不錯的選擇; 2.imageWithContentOfFile: 圖片只載入一次,不會緩衝在記憶體中,用完後就把佔用的記憶體釋放掉,每次都重新載入,這種載入方式適合只載入少次的情況。
Asset Catalog 是蘋果推出的新的圖片資源管理工具,方便、直觀 打包時,蘋果會將圖片資源統一打包成.car的檔案,我們擷取不到裡面的圖片路徑,也就無法使用imageWithContentOfFile的方式載入了,只能使用imageNamed來載入,也就意味著載入過的圖片全都緩衝在了記憶體裡,這樣,整個App佔用的記憶體就會比較大,被系統kill掉得風險就大了。
解決辦法: 由於之前的工程一直使用Asset Catalog方式管理圖片資源,現在需要想辦法減少整個App的記憶體佔用。首先想到的方法就是把圖片從Asset Catalog中移出來。 把Asset Catalog目錄下地所有內容都Copy出來,然後將Asset Cataglog整個目錄刪掉。
如果是原來使用Asset Catalog正確的話,@1x, @2x, @3x素材添加正確的話,這樣做直接就OK了,是沒有問題的。 如果有不當使用的話就麻煩了, 諸如命名不當的小問題,直接這樣讀取就會出現問題,需要我們手動解析並載入。
進入Asset Catalog目錄: echo “{"assets\”: [“ > a.json find Images.xcassets/ -name *.json | while read jsonfile; do tmppath=${jsonfile%.imageset/ } assetname=${tmppath## /} echo ”{\“assetname\”:\“${assetname}\”,\“content\”:“ >> a.json cat $jsonfile >> a.json; echo ‘},’ >>a.json done echo ‘]}’ >>a.json
去掉最後一個逗號,a.json就成了一個標準的JSON檔案,我們需要做的就是解析此檔案,根據實際情況載入不同的檔案。
使用Category的方式擴充UIImage類,重寫imageNamed方法,這樣原來所有帶緩衝的載入方式就變成了不帶緩衝的方式,當然,這個需要靈活處理,哪些圖片需要載入之後緩衝在記憶體,哪些不需要緩衝在記憶體,都要分開處理。
iOS圖片緩衝