在加載圖片中,我們常常用的最多的就是 UIImage(named:"image"),這個方法的優(yōu)點就是可以把圖片緩存在內(nèi)存當(dāng)中,讀取的時候非常的快,但是有個缺點就是會重復(fù)的創(chuàng)建圖片緩存,如下圖:

再看看用UIImage加載5萬個時內(nèi)存的消耗

用UIImage消耗了23.4的memory
接下來使用自定義的SwiftImage加載5萬個圖片內(nèi)存的消耗


可以看到自定義的SwiftImage消耗的內(nèi)存為13.1的memory
接下來看看這個SwiftImage類能否讓UIImageView顯示圖片

上面兩個是系統(tǒng)的,下面兩個是自定義的

結(jié)果表明,自定義的SwiftImage是完全有效的
實現(xiàn)思路
創(chuàng)建一個全局的字典[String : UIImage],key是圖片的名字,value是圖片的對象,在加載圖片的時侯,先判斷這個圖片的名字是否和字典的key一樣,如果是,說明這個圖片已存在內(nèi)存當(dāng)中,這時候可以用imageView.image = dic["image.jpg"]取出來,如果不是,就
dic["image.jpg"] = UIImage(named:"image.jpg")
imageView.image = dic["image.jpg"]
當(dāng)然上面只是實現(xiàn)的具體思路,接下來就上我自己的封裝的類
swift
import UIKit
// 自己封裝的單例
class MYImage {
private var imageDic: [String: UIImage?] = Dictionary()
class var shared: MYImage {
struct Inner {
static let instance: MYImage = MYImage()
}
return Inner.instance
}
func imageName(name name: String) -> UIImage? {
if imageDic.keys.count == 0 {
imageDic[name] = UIImage(named: name)
return imageDic[name]!
}
for key in imageDic.keys {
if key == name {
return imageDic[name]!
} else {
imageDic[name] = UIImage(named: name)
return imageDic[name]!
}
}
return nil
}
}
//將單例封裝在這個方法中
func SwiftImage(name name: String) -> UIImage? {
//調(diào)用單例
return MYImage.shared.imageName(name: "image.jpg")
}
#最后
創(chuàng)建單例和字典也需要消耗內(nèi)存的,所以,只有創(chuàng)建大量重復(fù)的圖片的時侯用這個比較好,其余的都用系統(tǒng)的。
我將測試的demo上傳到了<a >github</a>上
歡迎各位老司機多多點贊^_^