特定のクラスのインスタンスをキャッシュしたい。クラスはすべてのインスタンスの辞書を保持し、誰かが新しいインスタンスを要求すると、クラスは最初にキャッシュから要求を満たそうとします。ただし、メモリ管理には小さな問題があります。ディクショナリ キャッシュは挿入されたオブジェクトを保持するため、割り当てが解除されることはありません。メソッドをオーバーロードする必要がrelease
あり、保持カウントが 1 になったら、キャッシュからインスタンスを削除して、割り当てを解除できるようにする必要があります。
これは機能しますが、メソッドをいじくり回すのは苦手でrelease
、解決策が非常に複雑であることがわかりました。格納するオブジェクトを保持しないハッシュ クラスを使用できると考えました。そのようなものはありますか?特定のインスタンスの最後のユーザーがそれを解放すると、そのインスタンスはキャッシュから自動的に消えるという考え方です。
NSHashTableは私が探しているもののようですが、ドキュメントには「ガベージ コレクション環境での弱い関係のサポート」について記載されています。ガベージコレクションなしでも機能しますか?
明確化:誰かが本当にインスタンスを必要としない限り、インスタンスをメモリに保持する余裕はありません。そのため、最後の「実際の」ユーザーがインスタンスを解放したときにインスタンスをキャッシュから消去したいと考えています。
より良い解決策:これは iPhone でした。いくつかのテクスチャをキャッシュしたかったのですが、一方で、最後の実際の所有者がそれらを解放したらすぐにそれらをメモリから解放したかったのです。これをコーディングする簡単な方法は、別のクラスを使用することです (これを と呼びましょうTextureManager
)。このクラスはテクスチャ インスタンスを管理し、それらをキャッシュします。これにより、同じ名前のテクスチャに対する後続の呼び出しがキャッシュから提供されます。最後のユーザーがテクスチャを解放したときに、すぐにキャッシュを消去する必要はありません。テクスチャをメモリにキャッシュしておくだけで、デバイスのメモリが不足すると、メモリ不足の警告が表示され、キャッシュを削除できます。Texture
これはより良い解決策です。キャッシングがクラスを汚さず、いじる必要がなくrelease
、キャッシュ ヒットの可能性がさらに高くなるためです。のTextureManager
に抽象化できるResourceManager
ため、テクスチャだけでなく他のデータもキャッシュできます。