2009-04-09 7 views
3

Objective-Cの弱いキーを持つActionScript 3のDictionaryオブジェクトに類似したものがあるかどうかは疑問です。私はクラスのインスタンスを他の任意のインスタンスに「アタッチ」できるようにしたい。Objective-Cのweak-keyed dictionary

例;

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

以降:

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

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

可能ですか?私は+[NSValue valueWithNonretainedObject:]を見ましたが、これは私が後でクエリを行うときに私が欲しいものであるかどうかわかりません-[NSValue nonretainedObjectValue]それはオブジェクトがdealloc'dされたときにどのようにNSValueゼロのポインタを得ることができますか? )。

おかげで、

ベンジャミン

アップデート2011年9月23日:私はこれを行う方法はobjc_setAssociatedObjectと関連する関数であると考えています。 Objective-C Runtime Referenceを参照してください。

答えて

4

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

本当にこれが欲しいのなら、あなたの最良の賭けは、AppleのKey-Value Observingの使い方と同じ仕組みを使うことです。オブジェクトを対応するメタデータオブジェクトにマッピングするグローバルテーブル(NSHashMapまたはNSMapTableなど)を維持し、次に添付するオブジェクトのクラスのdealloc/finalizeメソッドを、対応するメタデータオブジェクトをテーブルで検索するバージョンに置き換えますそれを裂くためにメッセージを送る。 (また、クラスを元のdealloc/finalizeメソッドにマップする別のテーブルが1つまたは2つ必要です。)JRSwizzleはすばらしいインターフェイスを提供します。何のパフォーマンスヒットがありませんように

あなたの代わりにターゲットクラスのすべてのオブジェクトのためのdealloc/finalizeを上書きせ、プロキシクラスを作成し、ちょうどそのクラスのisaポインタを再割り当てすることができ、本当に空想することにしたい場合は、あなたが見ていないオブジェクトの割り当てを解除します。 (KVOもこれを行います)

+0

方法swizzlingはかなりまっすぐに聞こえる。あなたが言及したisa-swizzlingテクニックを詳しく説明できますか?私がそれを理解すると、オブジェクトのクラスを効果的に変更することができ、deallocという新しい実装が提供されます。 – bvanderveen

+0

はい、そうです。 –

+0

また、10.5にはこのために使用できる関数があります。これは今後の方が望ましいことです:http://developer.apple.com/DOCUMENTATION/Cocoa/Reference/ObjCRuntimeRef/Reference/reference.html#//apple_ref/ c/func/object_setClass –

1

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

+0

私はiPhone用に開発していますが、残念ながらNSHashMapは利用できないようです。 – bvanderveen