在开发中,有很多一模一样的对象,要重复使用很多次,如果每次使用的时候,都创建一个新的对象,都会浪费内存空间。
如果这样说,你是不是就想到了单例模式,单例模式就是使用一个对象打全场。
但是这次说的不是单例模式,是Flyweight Pattern,常见的翻译叫享元模式,我更习惯叫他共享轻量模式。
在iOS的UIKit框架中,UIFont, UIColor 都用到了这种模式。
整个工程项目共享同样的对象,可以在多种模块下使用,使用的时候,直接去存储池中取,取不到再创建它。
下面直接举一个了🌰
import UIKit
let red1 = UIColor.red
let red2 = UIColor.red
print(red1 === red2)
extension UIColor {
public static var colorStore: [String: UIColor] = [:]
public class func rgba(_ red: CGFloat, _ green: CGFloat, _ blue: CGFloat, _ alpha: CGFloat) -> UIColor {
let key = "\(red)\(green)\(blue)\(alpha)"
if let color = colorStore[key] {
return color
}
let color = UIColor(red: red, green: green, blue: blue, alpha: alpha)
colorStore[key] = color
return color
}
}
UIColor直接取到的red对象在内存中只保存一份,所以red1和red2的地址相同
对UIColor进行扩展,提供一个类方法创建UIColor对象,使用一个字典存储颜色。
在第一次取颜色对象的时候,创建它并储存在字典中。
如果第二次取同样颜色的时候,就直接从字典中取得这个颜色对象,并返回。
这就是共享轻量模式的一个简单例子,如果项目中使用的共享对象比较多,可以创建一个动态缓存池,根据LRU(Least Recently Used,最近很少使用)原则进行内存优化。
网友评论