iOS圖片緩衝

來源:互聯網
上載者:User

標籤:

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圖片緩衝

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.