如何在NSMutableDictionary中存储CoreFoundation类型引用?

时间:2014-03-11 21:40:16

标签: nsmutabledictionary core-foundation cftypes

如何在NSMutableDictionary中存储CoreFoundation类型引用?我怎么知道特定类型是否是CFType? (比如CFString)

1 个答案:

答案 0 :(得分:2)

通常,您必须将任何原始数据类型或Core Foundation对象转换为基础对象,以便将其插入到NSDictionary中,因此在从字典中获取值后,您可以确信它将是Cocoa对象。 / p>

许多Core Foundation对象都是"免费桥接"与他们的基础对应物,以便于来回转换。例如,CFStringRef和NSString,CFArrayRef和NSArray,CFDictionaryRef和NSDictionary等。因此,您可以简单地转换Core Foundation类型以将其存储到NSMutableDictionary中。例如,

CFStringRef myString = CFSTR("some string");
NSMutableDictionary *mutableDictionary = [[NSMutableDictionary alloc] initWithObjectsAndKeys:(__bridge id)(myString), @"myKey", nil];
NSLog(@"Dictionary contains %@", mutableDictionary);
//release dictionary here if not using ARC...

对于Core Foundation,所有Core Foundation对象都是从CFType派生的。所以关于CFStringRef是否是CFTypeRef的问题,是的。此外,只有Core Foundation,CFTypes可以插入到CFDictionaryRef容器中。如果您想从基本CFTypeRef中找出Core Foundation对象的类型,可以在其上调用CFTypeGetID()。然后,你需要比较类型,例如,检查它是否是一个字符串对象,你会做什么

CFStringRef myString = CFSTR("some string"); //say this is returned from CFDictionaryGetValue()
if (CFGetTypeID(myString) == CFStringGetTypeID())
{
    NSLog(@"CFType is a string");
}

每个Core Foundation对象都有自己的get type id函数,具有一致的命名约定。因此CFDataRef将具有CFDataGetTypeID(),CFDateRef将具有CFDateGetTypeID()。