我有一堆设备。 它们每个都有一个UUID,可以区分它们。 从逻辑上讲,这是通过跟踪所有内容的字典来键入它们的自然事物。
但是,[device UUID]方法会传回CFUUIDRef。
首先,这不是一个对象。 但是,嘿,我们可以解决这个问题。 [device_dictionary setObject:用于Key的设备(__ bridge id)[device uuid]];
不,等等,这不是一个有效的密钥:它没有实现< NSCopying>协议
更重要的是,由于我将这些CFUUIDRefs动态地投射到对象中,字典是否会在两次传递相同的CFUUIDRef时实现?或者,演员在动态创建的新对象是否会注册为同一个对象?
关心帮助我集思广益吗?当UUID作为非对象可用时,如何使用UUID键入字典?
答案 0 :(得分:3)
显而易见的解决方案是将返回的CFUUIDRef
转换为字符串,以用作字典中的键。
您可以使用CFUUIDRef
将CFStringRef
转换为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)
CFUUIDRef
是CFType
,您可以在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