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

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

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


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

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

結(jié)果表明,自定義的SwiftImage是完全有效的
實(shí)現(xiàn)思路
創(chuàng)建一個(gè)全局的字典[String : UIImage],key是圖片的名字,value是圖片的對(duì)象,在加載圖片的時(shí)侯,先判斷這個(gè)圖片的名字是否和字典的key一樣,如果是,說明這個(gè)圖片已存在內(nèi)存當(dāng)中,這時(shí)候可以用imageView.image = dic["image.jpg"]取出來,如果不是,就
dic["image.jpg"] = UIImage(named:"image.jpg")
imageView.image = dic["image.jpg"]
當(dāng)然上面只是實(shí)現(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
}
}
//將單例封裝在這個(gè)方法中
func SwiftImage(name name: String) -> UIImage? {
//調(diào)用單例
return MYImage.shared.imageName(name: "image.jpg")
}
#最后
創(chuàng)建單例和字典也需要消耗內(nèi)存的,所以,只有創(chuàng)建大量重復(fù)的圖片的時(shí)侯用這個(gè)比較好,其余的都用系統(tǒng)的。
我將測(cè)試的demo上傳到了<a >github</a>上
歡迎各位老司機(jī)多多點(diǎn)贊^_^