2009-07-29 25 views

答えて

6

まず、NSValueをCFMutableDictionaryにそのまま置くことができます。答えは「NSValueを使用する」です。しかし、私はあなたの質問の残りの部分は "Cocoaオブジェクトを使用しない"と仮定しています。その場合、保持しないCFMutableDictionaryを作成し、必要なポインタを置くことができます。いくつかのコード例については、"Defining Custom Collection Callbacks"を参照してください。私はこれらをたくさん使っています。

これらはまだポインタでなければならないことに注意してください。したがって、スタックではなくヒープに構造体を割り当てる必要があります。つまり、メモリ管理が問題になります。もちろん、あなたが望むものであれば何でもできるコールバックのカスタムセットを作成することができます。したがって、独自のref-countingシステムでboostやboostを使用している場合でも、CFMutableDictionaryでそれを実装できます。

もちろん、構造体を小さなデータオブジェクトで置き換えることができます。それは通常はずっと簡単です。しかし、さまざまな問題にはさまざまな解決策が必要です。

+0

ありがとうRob!正確に私が探していたもの:非保持辞書。 –

+0

もう一つのオプションは、CFDataオブジェクトを介して構造体を渡すことです。 APIはこの種の使用法にはあまり適していません。NSValueが提供するエンディアン認識の面を失うことになりますが、他にも多くの欠点はありません。ある意味では、NSValueとNSDataは両方とも「生のバイト」のコピーを格納します。 NSValueは余分なメタデータを追跡します。これは、多くの目的、つまりCFコレクションクラスを介してメモリ内の構造体を渡すことはおそらく必要ありません。だからあなたの値の型をNSValueのカテゴリとして追加するのではなく、代わりにCFDataRefに/からいくつかのヘルパー関数を書くことができますか? – natevw

1

CFMutableDictionary

CFDictionaryAddValue CFTypeオブジェクトまたは辞書に追加するポインタ値。

あなたは構造体へのポインタを渡すだけです。

+0

うわー、私は間違いなく文書で少し近づいているはずです。カスタムコールバックを提供する必要がありますか、そのまま使用することはできますか? –

+0

構造体へのポインタがCFTypeを必要とするデフォルトの保持メソッドに渡されたときにクラッシュします。これが機能するには、コールバックをオーバーロードする必要があります。 –