2012-07-20 88 views
2

我有一堆設備。 他們每個人都有一個UUID區分他們彼此。從邏輯上講,這是自然的事情,然後在字典中跟蹤他們。使用CFUUIDRefs作爲字典的鍵

但是,[device UUID]方法會傳回一個CFUUIDRef。

首先,這不是一個對象。但是,嘿,我們可以解決這個問題。 [device_dictionary setObject:key(__ bridge id)[device uuid]]的設備;

不,等待,這不是一個有效的密鑰:它不實施<NSCopying>協議。

更重要的是,由於我正在將這些CFUUIDRefs強制轉換爲對象,字典甚至會在它傳遞兩次相同的CFUUIDRef時意識到這一點嗎?或者,由演員在飛行中創建的新對象是否不會註冊爲同一個對象?

小心幫我頭腦風暴呢?如果您將UUID作爲非對象提供,您將如何使用UUID鍵入字典?

回答

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

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:之前自定義回調(請參閱http://www.cocoabuilder.com/archive/cocoa/163407-using-nsimages-as-keys-to-dictionary.html#163439)導致崩潰。在任何情況下,使用CFDictionary代替NSDictionary是微不足道的。

另一種選擇是NSMapTable如果你想要一個Objective-C的解決方案:

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