標籤:style blog http color 使用 os io 檔案
最近在做最佳化程式的效能方面的工作,涉及到了圖片記憶體管理方面,所以這方面的內容總結一下,
1,為什麼做圖片記憶體管理?
問題a,程式啟動後,瀏覽圖片時, 記憶體一直增長。
問題b, 瀏覽圖片時,程式UI顯示不流暢,即使本地的圖處,也不流暢。
2,怎麼做圖片記憶體管理?
對應用程式定義域內的圖片記憶體進行管理, 當程式的多個地方需要 引用一個圖片時,都指向同一個圖片的記憶體位址。
3,如何做?
如果是本地資源時的圖片,地址固定,不存在到期問題 我們可以直接 使用系統 [UIImage ImageName:] 方法。 這個方法本身就做了,記憶體緩衝。
多個地方 調用同個圖片地址時,它返回的都是同一個記憶體位址。
如果是網狀圖片的話, 我們可以將 網路請求下來的圖片放在緩衝裡,下次再訪問時,先檢查此圖片是否在緩衝裡,如果在,則直接返回圖片,如果沒有,則檢查則重新請求。
大至的做法 是,將請求的URL 與圖片放在 字典裡, url 做key, 圖片內容 做value ,如果 下次再使用圖片時,先檢查url 的key 時否已經存在就可以了。
當然我們只是說了大概的原理,忽略許多細節,片記憶體大小管理,圖片檔案快取管理,圖片同步/非同步載入, 圖片記憶體清理時,不同的圖片的清理策略 等等, 諸多問題。
當然,開源圖片記憶體管理項目比較多,對以上的問題,解決的也比較 好, 以下是我推薦的自己常用的庫
a, SGImageCache https://github.com/seatgeek/SGImageCache
[SGImageCache getImageForURL:url thenDo:^(UIImage *image) { if (image) { self.imageView.image = image; }}];
b, SDWebImageManager
SDWebImageManager *manager = [SDWebImageManager sharedManager];UIImage *cachedImage = [manager imageWithURL:url];if (cachedImage){ // Use the cached image immediatly}else{ // Start an async download [manager downloadWithURL:url delegate:self];}
(SDWebImageManager *)imageManager didFinishWithImage:(UIImage *)image{ // Do something with the downloaded image}</code>
轉載請標明出處 http://blog.csdn.net/sea918 謝謝。