使用CFUUIDRefs作为词典的键

时间:2012-07-20 02:21:43

标签: iphone cocoa nsdictionary

我有一堆设备。 它们每个都有一个UUID,可以区分它们。 从逻辑上讲,这是通过跟踪所有内容的字典来键入它们的自然事物。

但是,[device UUID]方法会传回CFUUIDRef。

首先,这不是一个对象。 但是,嘿,我们可以解决这个问题。 [device_dictionary setObject:用于Key的设备(__ bridge id)[device uuid]];

不,等等,这不是一个有效的密钥:它没有实现< NSCopying>协议

更重要的是,由于我将这些CFUUIDRefs动态地投射到对象中,字典是否会在两次传递相同的CFUUIDRef时实现?或者,演员在动态创建的新对象是否会注册为同一个对象?

关心帮助我集思广益吗?当UUID作为非对象可用时,如何使用UUID键入字典?

2 个答案:

答案 0 :(得分:3)

显而易见的解决方案是将返回的CFUUIDRef转换为字符串,以用作字典中的键。

您可以使用CFUUIDRefCFStringRef转换为CFUUIDCreateString(),如下所示:

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

然后,您可以使用免费桥接将CFStringRef转换为NSString,以便在NSDictionary中使用。

如果您需要将UUID的字符串表示形式转换回CFUUIDRef,可以使用CFUUIDCreateFromString(),如下所示:

CFUUIDRef uuid = CFUUIDCreateFromString(kCFAllocatorDefault, uuidString);

还有CFUUIDRef的包装器,它实现了NSCoding,可以在https://gist.github.com/294023找到。但是,这似乎与ARC兼容。

答案 1 :(得分:1)

CFUUIDRefCFType,您可以在CFType中使用任意CFDictionary作为键:

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的{​​{1}} 中的密钥会调用NSMutableDictionary 自定义回调(请参阅http://www.cocoabuilder.com/archive/cocoa/163407-using-nsimages-as-keys-to-dictionary.html#163439)导致崩溃。在任何情况下,使用-setObject:forKey:代替CFDictionary都是微不足道的。

如果您需要Objective-C解决方案,则另一个选项是NSDictionary

NSMapTable