2

私はたくさんのデバイスを持っています。それぞれに、それらを互いに区別するUUIDがあります。論理的には、これはそれらすべてを追跡する辞書でそれらをキーイングするための自然なことです。

ただし、[デバイスUUID]メソッドはCFUUIDRefを返します。

まず、これはオブジェクトではありません。しかしねえ、私たちはそれを修正することができます。[device_dictionary setObject:device for Key(__ bridge id)[device uuid]];

いいえ、待ってください。これは有効なキーではありません。<NSCopying>プロトコルを実装していません。

さらに、これらのCFUUIDRefをオンザフライでオブジェクトにキャストしているので、同じCFUUIDRefが2回渡された場合でも、ディクショナリは認識しますか?または、キャストによってその場で作成された新しいオブジェクトは、同じオブジェクトとして登録されませんか?

これについてブレインストーミングするのを手伝ってくれませんか?非オブジェクトとして使用可能な場合、UUIDを使用して辞書にキーを設定するにはどうすればよいですか?

4

2 に答える 2

3

明らかな解決策は、返さCFUUIDRefれた文字列を辞書のキーとして使用するための文字列に変換することです。

CFUUIDRef次のようにをCFStringRef使用してに変換できCFUUIDCreateString()ます。

CFStringRef uuidString = CFUUIDCreateString(kCFAllocatorDefault, [device uuid]);

次に、フリーダイヤルブリッジを使用して、をで使用するためCFStringRefにに変換できます。NSStringNSDictionary

UUIDの文字列表現をに戻す必要がある場合は、次のようにCFUUIDRef使用できます。CFUUIDCreateFromString()

CFUUIDRef uuid = CFUUIDCreateFromString(kCFAllocatorDefault, uuidString);

https://gist.github.com/294023CFUUIDRefある実装用のラッパーもあります。ただし、これはARC互換ではないようです。NSCoding

于 2012-07-20T02:42:30.023 に答える
1

CFUUIDRefは、であり、 :のキーとしてCFType任意のものを使用できます。CFTypeCFDictionary

CFMutableDictionaryRef d = CFDictionaryCreateMutable(
  kCFAllocatorDefault, 
  0, 
  &kCFTypeDictionaryKeyCallBacks, 
  &kCFTypeDictionaryValueCallBacks);

CFUUIDRef u1 = CFUUIDCreateFromString(kCFAllocatorDefault, CFSTR("68753A44-4D6F-1226-9C60-0050E4C00067"));
CFUUIDRef u2 = CFUUIDCreateFromString(kCFAllocatorDefault, CFSTR("68753A44-4D6F-1226-9C60-0050E4C00067"));

CFDictionarySetValue(d, u1, CFSTR("fnord"));

CFShow(CFDictionaryGetValue(d, u2)); // prints "fnord"

残念ながら、この場合、フリーダイヤルブリッジは適切に機能しません。これは、カスタムコールバックの前に-copyキーで呼び出されるためです( http://www.cocoabuilder.com/archive/cocoa/163407-using-nsimages-を参照)。 as-keys-to-dictionary.html#163439)結果としてクラッシュが発生しました。いずれにせよ、の代わりに使用するのは簡単です。NSMutableDictionary-setObject:forKey: CFDictionaryNSDictionary

もう1つのオプションはNSMapTable、Objective-Cソリューションが必要な場合です。

NSMapTable *t = NSCreateMapTable(NSObjectMapKeyCallBacks, NSObjectMapValueCallBacks, 0);    
NSMapInsert(t, u1, CFSTR("fnord")); 
NSLog(@"%@", NSMapGet(t, u2)); // prints "fnord"
于 2012-07-20T03:24:08.553 に答える