NSHashTable是iOS中一種集合類型,它類似于集合Set。但其中可以添加弱引用weak元素。相關介紹可以參考Cocoa 集合類型:NSPointerArray,NSMapTable,NSHashTable。
定義協(xié)議LikeDelegate,并在需要的ViewController中實現(xiàn)協(xié)議。
protocol LikeDelegate {
func refreshLikeStatus()
}
定義Manager保存NSHashTable集合,options選擇weakMemory使其中保存的元素弱引用:
struct LikeManager {
static var hashVC: NSHashTable = NSHashTable<UIViewController>(options: .weakMemory)
}
在實現(xiàn)LikeDelegate協(xié)議的UIViewController初始化時添加自身到NSHashTable中:
override func viewDidLoad() {
super.viewDidLoad()
LikeManager.hashVC.add(self)
}
在需要調(diào)用協(xié)議時,通過遍歷集合中還沒被釋放的元素并調(diào)用實現(xiàn)的協(xié)議方法:
var list: [UIViewController]? = LikeManager.hashVC.allObjects
for delegate in list ?? [] {
if let dele = delegate as? LikeDelegate {
dele.refreshLikeStatus()
}
}
通過遍歷沒有被釋放的協(xié)議,并調(diào)用其中的方法。其中調(diào)用allObjects生成數(shù)組時會強引用UIViewController,使用的時候需要注意內(nèi)存管理。
使用NSPointerArray,NSMapTable同樣也可以實現(xiàn)上述效果,看官可以自行嘗試。