3

DictionaryObjective-C で弱いキーを持つActionScript 3 のオブジェクトに似たものを持つことが可能かどうか疑問に思っています。クラスのインスタンスを他の任意のインスタンスに「アタッチ」できるようにしたいと考えています。

例;

MetaData *meta = [MetaData metaDataForObject:someObject];
meta.whatever = foo;

以降:

foo = [MetaData metaDataForObject:someObject].whatever;
[foo doStuff];

トリッキーな部分は、によって参照されるオブジェクトが解放された後、によってsomeObject参照されるオブジェクトをmeta解放したいということです (そして、クライアント コードがそれを保持していないと仮定して、解放します)。

可能?調べてみまし+[NSValue valueWithNonretainedObject:]たが、後でクエリを実行-[NSValue nonretainedObjectValue]すると、ガベージへのポインターを取得するように見えるため、これが必要かどうかわかりません (オブジェクトが解放されたときに NSValue がポインターをゼロにするにはどうすればよいでしょうか?)。

ありがとう、

ベンジャミン

2011 年 9 月 23 日更新:これを行う方法はobjc_setAssociatedObject、関連する関数を使用することだと思います。Objective-C ランタイム リファレンスを参照してください。

4

2 に答える 2

4

あなたが求めているのは、割り当てが解除されている弱参照インスタンス変数に反応する機能のようです。確かに__weak属性 (GC を有効にして) を使用して弱い参照を作成できますが、ターゲットが GC された後にそのような属性がゼロになったときにキャッチする組み込みのメカニズムはありません。

本当にこれが必要な場合は、Apple の Key-Value Observing と同じメカニズムを使用することをお勧めします: メソッド スウィズリングです。オブジェクトを対応するメタデータ オブジェクトにマッピングするグローバル テーブル ( や など) を維持し、NSHashMapアタッチするオブジェクトのクラスの/メソッドを、テーブル内の対応するメタデータ オブジェクトを検索してメッセージを送信するバージョンにNSMapTable置き換えます。それを取り壊すために。(さらに、クラスを元の/メソッド にマップする別のテーブルが 1 つまたは 2 つ必要です。) JRSwizzleは、スウィズリングへの優れたインターフェースを提供します。deallocfinalizedeallocfinalize

本当に凝りたい場合は、ターゲット クラスのすべてのオブジェクトのdealloc/を上書きする代わりに、プロキシ クラスを作成し、そのクラスだけのポインターを再割り当てして、オブジェクトの割り当て解除でパフォーマンスが低下しないようにすることができます。見ていない。(KVOもこれを行います。)finalizeisa

于 2009-04-10T03:08:29.210 に答える
1

おそらくNSHashMapを探していますか?参照をゼロにします。

于 2009-04-09T19:54:20.410 に答える