1

保持されていないオブジェクトの束への参照を持つクラス/オブジェクトを実装するにはどうすればよいidですか?

UIControl/NSControlが持っているものに似たものが欲しいaddTarget:(id)target action:(SEL)action ...;(ただし、私の場合、そのUIControlEvents部分は必要ありません)。このターゲット/アクション パターンを使用したい (そしてできればデリゲート パターンを避けたい) が、そのためには、オブジェクトに追加されたターゲットが保持されないようにするか、保持サイクルが発生する可能性があることを確認する必要があります。

malloc/を使用して独自の配列を実装して、freeターゲットが保持されないようにすることは1つの解決策になると思いますが、この面倒なことはすべて、すでにどこかに実装されている解決策があるようなにおいがします。ある?

4

2 に答える 2

4

OS X では、 、または (辞書が必要な場合)キーと値のいずれかまたは両方を弱く保持できる を使用しNSPointerArrayて、そのオブジェクトへの弱い参照を保持する を作成できます。+[NSPointerArray weakObjectsPointerArray]NSMapTable

どちらも現在 iOS では利用できませんが、Core Foundation は利用できます。OS X または iOS のいずれかで、CFArrayまたはを使用してコールバックをCFDictionary渡しNULLて、コレクションに含まれるオブジェクトのメモリ管理を行わないようにします。これらを無料のブリッジされた Cocoa 対応物であるかのように使用しようとすると、コレクションは保持しない/コピーしないというあなたの欲求を尊重しないことに注意してください. CF 関数を使用してそれらとやり取りする (またはラッパー クラスを作成する) 必要があります。

NSValueを使用してオブジェクトを でラップしvalueWithNonretainedObject:、それらを Cocoa コレクション ( NSDictionary/ NSarray) に入れることもできます。コレクションは値を所有しますが、値はそのオブジェクトを所有しません。

于 2012-08-13T05:56:20.617 に答える
1

ref カウント操作を実行しないコールバックを指定して を作成できますCFArrayRef(非常に怠惰な場合は、コールバックに 0 を指定します)。

CFAllocatorRef allocator = 0;
const void **values = ...;
CFIndex numValues = ...;
const CFArrayCallBacks* const callBacks = 0;

CFArrayRef arr = CFArrayCreate(allocator, values, numValues, callBacks);
于 2012-08-13T05:56:29.940 に答える