読者です 読者をやめる 読者になる 読者になる

亀岡的プログラマ日記

京都のベッドタウン、亀岡よりだらだらとお送りいたします。

弱参照ってなんなのさ。

最近自分の情報収集圏内で、局所的にWeakEventパターンが話題になっていた。用途としてはMVVMをやるときのModel-ViewModel間のインタラクションのために、イベント付けまくるからリークが、みたいな流れで。
MVVMでメモリリークしちゃってました 原因と対策編 - かずきのBlog@Hatena

で、WeakEventちょっと調べようかと思ったんですが、よく考えたらその前にWeakReference(弱参照)をしらないじゃん、私。

ということで、弱参照についてまとめます。今更感アリアリですが。

そもそも弱参照って何さ?

弱参照は、その名のとおり、弱い参照。通常、あるオブジェクトAから別のオブジェクトBに参照を貼ると、Aが存在し、かつその参照が存続する限りはBはGCされません。当たり前ですね。

ところが、弱参照で張った参照関係は、Aが存在し、かつその参照があったとしても、普通にGCされます。

ということは、参照があるにもかかわらず、いざアクセスしようとしたときには参照がなくなってる、なんてこともあるわけです。
(それが証拠に、WeakRefferenceにはIsAliveなんてプロパティが存在します)

で、何に使うの?

普通に考えたら使い道に困りそうな弱参照ですが、そんなことはありません。うってつけの使い道があります。
それは、キャッシュ

キャッシュの使い道は、一度使ったファイルをもう一度使いまわしてやること。ただし、膨れ上がり過ぎたら、適当なところでキャッシュからクリアしてやらないとメモリを無制限に食っちまいます。
つまり、とりあえずは保持しておくけれど、容量的に切羽詰ってきたらどこかにやっていいよ、的な雰囲気なわけですね。

で、弱参照の特徴。ほっとくとGCのタイミングでクリアされるってのは、(GCを普通に起こしている限りにおいては)容量がきつくなったらクリアされるのとほぼ同義。
つまり、キャッシュするオブジェクトを弱参照で保持してやれば、ごくごく自然にキャッシュを実現できるわけです。

実装は?

ちょこちょこ言っていますが、そのものズバリのWeakRefernceクラスってのがあります。
WeakReference クラス (System)

これをnewして、コンストラクタに参照したいブツを渡せばOKです。

こんだけ?

サンプルつくろうと思ったらBlendが動かないんだよコノヤロウ。
てなわけで、続く。