2

我有一堆设备。它们每个都有一个 UUID 来区分它们。从逻辑上讲,这是很自然的事情,通过在字典中跟踪它们来键入它们,然后。

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

首先,这不是一个对象。但是,嘿,我们可以解决这个问题。[device_dictionary setObject:device for Key(__bridge id)[device uuid]];

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

更重要的是,由于我将这些 CFUUIDRef 动态转换为对象,字典是否会意识到当它被两次传递相同的 CFUUIDRef 时?或者由演员动态创建的新对象不会注册为同一个对象?

愿意帮我集思广益吗?当 UUID 作为非对象可用时,您将如何使用 UUID 键入字典?

4

2 回答 2

3

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

您可以将 转换CFUUIDRef为 a CFStringRefusing CFUUIDCreateString(),如下所示:

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

然后,您可以使用免费桥接将 转换为CFStringRefNSStringNSDictionary.

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

CFUUIDRef uuid = CFUUIDCreateFromString(kCFAllocatorDefault, uuidString);

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

于 2012-07-20T02:42:30.023 回答
1

CFUUIDRef是 a CFType,您可以使用 anyCFType作为 a 中的键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会调用 in 的键NSMutableDictionary(参见http://www.cocoabuilder.com/archive/cocoa/163407-using-nsimages- as-keys-to-dictionary.html#163439)导致崩溃。在任何情况下,使用. 代替都是微不足道的。-setObject:forKey: CFDictionaryNSDictionary

另一个选择是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 回答