【问题标题】:Using CFUUIDRefs as a Dictionary's keys使用 CFUUIDRefs 作为字典的键
【发布时间】:2012-07-25 07:30:22
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

    标签: iphone cocoa nsdictionary


    【解决方案1】:

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

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

    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 不兼容。

    【讨论】:

      【解决方案2】:

      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 将在NSMutableDictionary-setObject:forKey: 中的键上调用自定义回调之前(参见@ 987654321@) 导致崩溃。无论如何,使用CFDictionary 代替NSDictionary 是微不足道的。

      如果您想要一个 Objective-C 解决方案,另一个选项是 NSMapTable

      NSMapTable *t = NSCreateMapTable(NSObjectMapKeyCallBacks, NSObjectMapValueCallBacks, 0);    
      NSMapInsert(t, u1, CFSTR("fnord")); 
      NSLog(@"%@", NSMapGet(t, u2)); // prints "fnord"
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-07-25
        • 1970-01-01
        • 1970-01-01
        • 2019-06-29
        • 2020-09-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多