我想缓存某个类的实例。该类保留其所有实例的字典,当有人请求新实例时,该类首先尝试满足来自缓存的请求。但是内存管理有一个小问题:字典缓存保留了插入的对象,因此它们永远不会被释放。我确实希望它们被解除分配,因此我不得不重载该release
方法,并且当保留计数降至 1 时,我可以从缓存中删除实例并让它被解除分配。
这行得通,但我不喜欢乱搞该release
方法并发现解决方案过于复杂。我想我可以使用一些不保留它存储的对象的散列类。有这样的吗?这个想法是,当某个实例的最后一个用户释放它时,该实例将自动从缓存中消失。
NSHashTable似乎是我正在寻找的东西,但文档谈到“在垃圾收集环境中支持弱关系”。没有垃圾收集它也能工作吗?
澄清:除非有人真的需要它们,否则我无法将实例保存在内存中,这就是为什么我想在最后一个“真实”用户释放实例时从缓存中清除实例。
更好的解决方案:这是在 iPhone 上,我想缓存一些纹理,另一方面,我想在最后一个真正的持有者释放它们时立即从内存中释放它们。更简单的编码方法是通过另一个类(我们称之为TextureManager
)。此类管理纹理实例并缓存它们,以便从缓存中提供对具有相同名称的纹理的后续调用。当最后一个用户释放纹理时,无需立即清除缓存。我们可以简单地将纹理缓存在内存中,当设备内存不足时,我们会收到内存不足警告并可以清除缓存。这是一个更好的解决方案,因为缓存的东西不会污染Texture
类,我们不必搞砸,release
缓存命中的机会甚至更高。这TextureManager
可以抽象成一个ResourceManager
,这样它就可以缓存其他数据,而不仅仅是纹理。