問題タブ [weak-references]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - Java のように、.NET に SoftReference と WeakReference がないのはなぜですか?
私はWeakReferenceが大好きです。しかし、参照がどの程度弱いと見なすか (たとえば、1 から 5 のスケールで) を CLR に伝える方法があればいいのにと思います。それは素晴らしいことです。
JavaにはSoftReference、WeakReferenceがあり、「ファントム参照」と呼ばれる3番目のタイプもあると思います。これは、そのオブジェクトがチョップを取得するかどうかを決定するときに、GC が異なる動作アルゴリズムを持っている 3 つのレベルです。
.NET の WeakReference をサブクラス化して (幸いなことに、それは封印されていません)、有効期限タイマーなどに基づく疑似 SoftReference を作成することを考えています。
c# - .NET に弱い参照はありますか?
アプリケーションで特定のクラスのオブジェクトのリストを保持したいと考えています。しかし、私はまだオブジェクトをガベージコレクションしたいと思っています。.NET で弱参照を作成できますか?
参考のため:
MSDN からの回答:
オブジェクトとの弱い参照を確立するには、追跡するオブジェクトのインスタンスを使用して WeakReference を作成します。次に、Target プロパティをそのオブジェクトに設定し、オブジェクトを null に設定します。コード例については、クラス ライブラリの WeakReference を参照してください。
objective-c - Objective C でのインスタンスのキャッシュ
特定のクラスのインスタンスをキャッシュしたい。クラスはすべてのインスタンスの辞書を保持し、誰かが新しいインスタンスを要求すると、クラスは最初にキャッシュから要求を満たそうとします。ただし、メモリ管理には小さな問題があります。ディクショナリ キャッシュは挿入されたオブジェクトを保持するため、割り当てが解除されることはありません。メソッドをオーバーロードする必要がrelease
あり、保持カウントが 1 になったら、キャッシュからインスタンスを削除して、割り当てを解除できるようにする必要があります。
これは機能しますが、メソッドをいじくり回すのは苦手でrelease
、解決策が非常に複雑であることがわかりました。格納するオブジェクトを保持しないハッシュ クラスを使用できると考えました。そのようなものはありますか?特定のインスタンスの最後のユーザーがそれを解放すると、そのインスタンスはキャッシュから自動的に消えるという考え方です。
NSHashTableは私が探しているもののようですが、ドキュメントには「ガベージ コレクション環境での弱い関係のサポート」について記載されています。ガベージコレクションなしでも機能しますか?
明確化:誰かが本当にインスタンスを必要としない限り、インスタンスをメモリに保持する余裕はありません。そのため、最後の「実際の」ユーザーがインスタンスを解放したときにインスタンスをキャッシュから消去したいと考えています。
より良い解決策:これは iPhone でした。いくつかのテクスチャをキャッシュしたかったのですが、一方で、最後の実際の所有者がそれらを解放したらすぐにそれらをメモリから解放したかったのです。これをコーディングする簡単な方法は、別のクラスを使用することです (これを と呼びましょうTextureManager
)。このクラスはテクスチャ インスタンスを管理し、それらをキャッシュします。これにより、同じ名前のテクスチャに対する後続の呼び出しがキャッシュから提供されます。最後のユーザーがテクスチャを解放したときに、すぐにキャッシュを消去する必要はありません。テクスチャをメモリにキャッシュしておくだけで、デバイスのメモリが不足すると、メモリ不足の警告が表示され、キャッシュを削除できます。Texture
これはより良い解決策です。キャッシングがクラスを汚さず、いじる必要がなくrelease
、キャッシュ ヒットの可能性がさらに高くなるためです。のTextureManager
に抽象化できるResourceManager
ため、テクスチャだけでなく他のデータもキャッシュできます。
c++ - アドレスがnullのオブジェクトを定義する方法は?
参照が null になるオブジェクトを C で定義するにはどうすればよいでしょうか?
それを行う方法はいくつかありますが、私のニーズに合うものはありません。
実際、私は標準準拠のソリューション (c99) を好みますが、動作するものは何でも問題ありません。
編集済み:これを行う理由は、バーが常に null になるとは限らないためです。より適切な例を次に示します。
もちろん、これはまだあまり関連性がありません。条件で #if を使用できるからです。プロジェクトには、実際には大きな構造、多くのファイル、いくつかのコンパイラ、いくつかの cpu ターゲット、および使用する構文の複雑さに指数関数的になる確率でバグを生成する多くのプログラマが含まれます。単純なマクロで foo オブジェクトを宣言したいのはそのためです。
.net - ラムダ式により、弱参照のターゲットをGCにすることはできませんか?
GC後にw2.Targetがnullにならないのはなぜですか?
編集
すべての答えに感謝します、ブライアン・ラスムッセンとジョン・スキートあなたの答えは正しいです。今、私は何が起こっているのかを完全に理解しているので、すべてをより明確にするために別の例を書きました。
次の例は、次のことを示しています。
Test#create()がインスタンスのプロパティやメソッドを参照しない場合、Jon Skeetが言ったように、「private static HandleMessage CS $ <> 9__CachedAnonymousMethodDelegate1」がコンパイラによって作成されます。これにより、同じものを使用すると効率が向上します。ラムダ式を複数回。
Test#create()がインスタンスのプロパティまたはメソッドを参照する場合、以下の例のようにthis.ToString();を呼び出します。その場合、コンパイラはインスタンスメソッドのロジックを置き換える静的メソッドを作成できないため、GC後にHandleMessageインスタンスを収集できます。
python - なぜこのバインドされたメソッドでweakrefが機能しないのですか?
コールバックでweakrefsを使用しようとしているプロジェクトがあり、何が間違っているのかわかりません。私が混乱している正確な動作を示す簡略化されたテストを作成しました。
このテストで test_a が期待どおりに動作するのに、クラスの初期化と test_b の呼び出しの間に self.MyCallbackB の weakref が消えるのはなぜですか? インスタンス(a)が存在する限り、self.MyCallbackBへの参照が存在するはずですが、存在しません。
.net - .net の SoftReference に相当しますか?
私は に精通していますが、単に gc が実行されるたびに (Java の のように) ではなく、メモリが少ない場合にのみWeakReference
クリアされる参照型を探しています。メモリに依存するキャッシュを実装する方法を探しています。SoftReference
c# - このキャッシング機能は、私が思うように機能しますか?
私はこのメソッドを暫定的に作成しました:
少し背景があります:
私は少しこのように見えるいくつかの長く風変わりなレガシーメソッドを持っています:
私の潜在的な解決策はこれを行うことです:
これについての私の考え:
- このメソッド呼び出しの範囲を超えてキャッシュする必要はないので、メソッドが返されるとすぐにGCがそれを収集すれば問題ありません。
- コードがデータをロードする必要のないパスをとる場合、ヒットは発生しません
- データが必要な場合は、再度必要になったときに弱参照にキャッシュされます。
- GCが途中で収集された場合は、再ロードされるだけなので問題ありません。
私の質問:
- これは実際に機能しますか?
WeakCacheFor
-誤って保持されることへの強い言及を引き起こす可能性のある方法で私が見逃したものはありますか? - 私は自分の利益のために賢すぎますか?-必要がない場合でも、ヒットを発生させてデータを通常のローカル変数にキャッシュする必要がありますか?
私は賢すぎるのではないかと思いますが、たとえ私が賢い場合でも、これは他の状況で有用に適用できる解決策のように他の誰かに見えますか?
更新:明らかに.IsAliveを信頼できないため、関数が変更されました
更新:Func
メソッドの最後で返されたものがスコープ外になることに気付いたので、weakrefはまったく必要なく、通常のrefは問題なく機能します。「木々の森が見えない」という事件に悩まされていたと思います。
objective-c - Objective-C の弱いキー付き辞書
Dictionary
Objective-C で弱いキーを持つActionScript 3 のオブジェクトに似たものを持つことが可能かどうか疑問に思っています。クラスのインスタンスを他の任意のインスタンスに「アタッチ」できるようにしたいと考えています。
例;
以降:
トリッキーな部分は、によって参照されるオブジェクトが解放された後、によってsomeObject
参照されるオブジェクトをmeta
解放したいということです (そして、クライアント コードがそれを保持していないと仮定して、解放します)。
可能?調べてみまし+[NSValue valueWithNonretainedObject:]
たが、後でクエリを実行-[NSValue nonretainedObjectValue]
すると、ガベージへのポインターを取得するように見えるため、これが必要かどうかわかりません (オブジェクトが解放されたときに NSValue がポインターをゼロにするにはどうすればよいでしょうか?)。
ありがとう、
ベンジャミン
2011 年 9 月 23 日更新:これを行う方法はobjc_setAssociatedObject
、関連する関数を使用することだと思います。Objective-C ランタイム リファレンスを参照してください。